内置SQL对象
内置对象(表达式等)不算多, 很多是为了方便使用,单纯在编程概念上的,并非SQL原生的,可以参考自定义SQL
CASE表达式
支持两种模式,简单case,搜索case,由Sql.case_()或Sql.caseWhen()调用创建
sql
CASE [expr]
WHEN expr THEN expr
[WHEN expr THEN expr ...]
END使用搜索case时 when只支持传入Condition
字面量
Literal.of()创建,字面量不会转换?,直接明文替换在SQL中,支持类型
- 基本类型及其包装类
- String
- null 转换为SQL中的
NULL - 所有Number实现类
子查询
支持标量子查询,行子查询, 由Select语句调用.asSubquery() 创建
支持派生表(带别名子查询), 由Select语句调用.as(alias)创建
列
org.huiche.ast.metadata.Column最常见的表达式,其继承org.huiche.ast.expression.Expression, 在Column进行各种SQL操作后,会变为Expression或Condition或者是别名AliasSegment 列使用Column.of()创建,支持多种参数传入
String field,字符串(支持@FieldNameConstants), 你应该能看到,它的参数名是field,而不是column,它会当作属性解析,会转换命名,比如artistName->artist_name作为列名String table,String field,table当作表名,不会进行命名转换,field同上SerializableFunction<T, ?> columnlambda方法引用, 会解析类和属性,当作表名和列名,不能使用此方式传递父类属性,会解析表名错误Enum<?> columnlombok字段枚举类@FieldNameConstants(asEnum=true), 会解析类和属性,当作表名和列名,如果传入非lombok生成的枚举类会报错.不能使用此方式传递父类属性,会解析表名错误
仅支持在Select语句的select方法中,即作为selection时,传递String才会当作列解析,或者是方法参数明确使用field或fields命名时当作列解析, 在其他场景,均会当作普通字符串处理
如果要在select传递普通字符串当作selection,你需要使用Literal.of()包装字符串
另外支持Column.ofStatic(String table,String column)方法, 这个方法的table和column则均不会进行命名转换
表
org.huiche.ast.metadata.Table,使用Table.of()创建,支持传入
- 字符串
name,当作名称,名称不会进行转换,如果需要表上级信息,可以直接在名称中拼接,比如test.dbo.artist Class可传入类,会自动解析表名,默认是类名进行转换,可以添加@org.huiche.core.annotation.Table(作用于类)或@org.huiche.core.annotation.TablePrefix(作用于包)进行调整