如何用Querydsl生成MySQL/PostgreSQL支持的元组比较表达式?
Querydsl构建元组比较表达式解决方案
要生成where (last_name, first_name, actor_id) < ('Allen', 'Meryl', 194)这类元组比较语句,不能直接用Expressions.list()返回的对象调用lt()方法——因为ListExpression默认仅提供相等、IN等基础操作。需要通过Expressions.booleanOperation()手动构建比较逻辑,具体实现如下:
代码实现
假设你已经正确填充了List<ComparablePath> paths,包含last_name、first_name、actor_id三个字段路径:
import com.querydsl.core.types.Expression; import com.querydsl.core.types.Ops; import com.querydsl.core.types.dsl.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import java.util.Arrays; // 构建左边的字段元组表达式 ListExpression<?, ?> leftTuple = Expressions.list(paths.toArray(new ComparablePath[0])); // 构建右边的常量值元组表达式 List<Expression<?>> rightValues = Arrays.asList( Expressions.constant("Allen"), Expressions.constant("Meryl"), Expressions.constant(194) ); ListExpression<?, ?> rightTuple = Expressions.list(rightValues.toArray(new Expression[0])); // 手动创建小于比较的布尔表达式 BooleanExpression tupleLt = Expressions.booleanOperation(Ops.LT, leftTuple, rightTuple); // 包装到BooleanBuilder中 BooleanBuilder pred = new BooleanBuilder(tupleLt);
关键说明
Ops.LT是Querydsl内置的小于操作符,对应SQL中的<;如果需要其他比较(如<=、>),可替换为Ops.LTE、Ops.GT等内置操作符。- 该方式依赖数据库对元组比较的支持(MySQL 8+、PostgreSQL均支持),同时确保使用的Querydsl版本为4.0及以上。
- 若想简化代码,可直接将右边元组的构建逻辑内联到
booleanOperation调用中:
BooleanExpression tupleLt = Expressions.booleanOperation( Ops.LT, Expressions.list(paths.toArray(new ComparablePath[0])), Expressions.list( Expressions.constant("Allen"), Expressions.constant("Meryl"), Expressions.constant(194) ) ); BooleanBuilder pred = new BooleanBuilder(tupleLt);
内容的提问来源于stack exchange,提问作者SledgeHammer
相关产品推荐
相关产品推荐

