Skip to content

内置SQL对象

内置对象(表达式等)不算多, 很多是为了方便使用,单纯在编程概念上的,并非SQL原生的,可以参考自定义SQL

CASE表达式

支持两种模式,简单case,搜索case,由Sql.case_()Sql.caseWhen()调用创建

sql
CASE [expr]
WHEN expr THEN expr
[WHEN expr THEN expr ...]
END

使用搜索casewhen只支持传入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操作后,会变为ExpressionCondition或者是别名AliasSegment 列使用Column.of()创建,支持多种参数传入

  • String field,字符串(支持@FieldNameConstants), 你应该能看到,它的参数名是field,而不是column,它会当作属性解析,会转换命名,比如artistName->artist_name 作为列名
  • String table,String field, table当作表名,不会进行命名转换,field同上
  • SerializableFunction<T, ?> column lambda方法引用, 会解析类和属性,当作表名和列名,不能使用此方式传递父类属性,会解析表名错误
  • Enum<?> column lombok字段枚举类@FieldNameConstants(asEnum=true), 会解析类和属性,当作表名和列名,如果传入非lombok生成的枚举类会报错.不能使用此方式传递父类属性,会解析表名错误

仅支持在Select语句的select方法中,即作为selection时,传递String才会当作列解析,或者是方法参数明确使用fieldfields命名时当作列解析, 在其他场景,均会当作普通字符串处理

如果要在select传递普通字符串当作selection,你需要使用Literal.of()包装字符串

另外支持Column.ofStatic(String table,String column)方法, 这个方法的tablecolumn则均不会进行命名转换

org.huiche.ast.metadata.Table,使用Table.of()创建,支持传入

  • 字符串name,当作名称,名称不会进行转换,如果需要表上级信息,可以直接在名称中拼接,比如test.dbo.artist
  • Class 可传入类,会自动解析表名,默认是类名进行转换,可以添加@org.huiche.core.annotation.Table(作用于类)或@org.huiche.core.annotation.TablePrefix(作用于包)进行调整