自定义SQL
如果内置SQL无法满足,可以自定义
了解内置SQL:
静态表达式
org.huiche.ast.expression.Expression
java
Expression expr = Expression.of("静态sql");
// 之后expr可以用于select或者条件判断等,最终转译sql时, 静态sql会直接放入sql对应位置,不会做任何处理
Sql.select(expr);模板表达式
java
String template = "模板";
List<Object> params = new ArrayList();
Expression expr = Expression.of(template,params);
// 之后expr可以用于select或者条件判断等,最终转译sql时, 静态sql会直接放入sql对应位置,不会做任何处理
Sql.select(expr);模板语法为静态内容+{}占位替换,比如POSITION({} IN {}) 即代表添加一个POSITION函数, 有2个参数
实际转译SQL时,params会依次替换至模板中的{}的位置
如果需要动态的 不确定个数的参数, 可以定义一个{} 之后传入参数时,使用ListableSegment.of() 来包裹多个参数, 实际转译时,会将所有参数依次转译为params1,params2,params3... 这种形式,替换到模板对应的{} 位置
java
// 最终生成的sql为 CONCAT(artist.name,'张三','李四')
// 当然实际执行时,因为使用PreparedStatement, 转译生成的sql是 CONCAT(artist.name,?,?) 生成的params是["张三","李四"]
Expression expr = Expression.of("CONCAT({})",ListableSegment.of(Column.of(Artist::name),"张三","李四"));动态参数可以与静态参数结合,只需要动态参数对应的{}的位置的参数,传递为ListableSegment.of()即可
java
// 最终生成的sql为 artist.name IN ('张三','李四')
Expression expr = Expression.of("{} IN({})",Column.of(Artist::name),ListableSegment.of("张三","李四"));静态条件
org.huiche.ast.expression.Condition, 静态条件与静态表达式完全一样,只不过是改用Condition.of(staticSql)定义,返回结果是Condition 可以用在where和on等方法
模板条件
模板条件与模板表达式完全一样,只不过改用Condition.of(template,params)定义,返回结果是Condition 可以用在where和on等方法
自定义函数
在huiche里SQL的Function即Expression,本质上就是模板表达式,直接使用模板表达式定义即可,如果你需要的函数返回结果为条件,你可以使用模板条件来定义
使用自定义SQL时, 需要用户自行确保数据库兼容
现在,你已经了解了huiche的基本用法,点击下一页可以进一步了解更多用法