Skip to content

自定义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 可以用在whereon等方法

模板条件

模板条件与模板表达式完全一样,只不过改用Condition.of(template,params)定义,返回结果是Condition 可以用在whereon等方法

自定义函数

在huiche里SQL的FunctionExpression,本质上就是模板表达式,直接使用模板表达式定义即可,如果你需要的函数返回结果为条件,你可以使用模板条件来定义

使用自定义SQL时, 需要用户自行确保数据库兼容

现在,你已经了解了huiche的基本用法,点击下一页可以进一步了解更多用法