我正在尝试创建一个依赖于布尔参数数量的查询。创建谓词的函数如下所示:
Predicate createPredicate(Boolean param1, Boolean param2) {
List<BooleanExpression> booleanExpressions = new List<>();
if (param1)
booleanExpressions.add(/** expression 1 **/);
if (param2)
booleanExpressions.add(/** expression 2 **/);
convertExpressionsToPredicate(booleanExpressions);
}
问题出在convertExpressionsToPredicate
函数上。querydsl中有什么特殊的方法可以使用or
操作符将表达式列表连接到一个谓词中吗?
我正在寻找的解决方案应该转换为:
List<BooleanExpression> booleanExpressions = List(exp1, exp2, exp3);
进入:
Predicate p = exp1.or(exp2).or(exp3)
发布于 2015-09-01 09:26:30
要构造复杂的布尔表达式,请使用com.querydsl.core.BooleanBuilder
类。它实现了Predicate
,并且可以以级联的形式使用。例如:
public List<Customer> getCustomer(String... names) {
QCustomer customer = QCustomer.customer;
JPAQuery<Customer> query = queryFactory.selectFrom(customer);
BooleanBuilder builder = new BooleanBuilder();
for (String name : names) {
builder.or(customer.name.eq(name));
}
query.where(builder);
return query.fetch();
}
BooleanBuilder
是可变的,最初表示为null。在每次and
或or
调用之后,它表示操作的结果。
发布于 2021-05-06 09:14:57
如果有人正在使用Spring Boot JPA和QueryDSL,您可以使用以下命令来获得Page<YourType>
结果(Kotlin格式):
fun listCards(page: Int?, pageSize: Int?, orderColumnName: String?, orderDirection: Sort.Direction?, filter: CardFilter?): Page<Card> {
val pageRequest = PageRequest.of(page ?: 0, pageSize ?: 10, orderDirection ?: Sort.Direction.ASC, orderColumnName ?: Card::cardNumber.name)
val conditions = BooleanBuilder()
filter?.cardNumber?.let { qCard.cardNumber.contains(it) }?.let { conditions.and(it) }
filter?.cardHolderName?.let { qCard.cardHolderName.containsIgnoreCase(it) }?.let { conditions.and(it) }
filter?.phoneNumber?.let { qCard.phoneNumber.contains(it) }?.let { conditions.and(it) }
filter?.email?.let { qCard.email.contains(it) }?.let { conditions.and(it) }
filter?.locale?.let { qCard.locale.eq(it) }?.let { conditions.and(it) }
if (conditions.hasValue()) {
return cardRepository.findAll(conditions.value!!, pageRequest)
}
return cardRepository.findAll(pageRequest)
}
https://stackoverflow.com/questions/32326922
复制相似问题