如何使用querydsl动态添加where子句?

问题描述 投票:9回答:2

我一直在寻找文档的一些时间,并尝试了几件事,但我无法动态添加querydsl的where子句:

伪代码,我需要像“if”这样的东西:

boolean addWhereClause = false; 
QAddress address = QAddress.address; 
JPQLQuery query = new JPAQuery(getEntityManager()); 
query.from(address)
     .if(addWhereClause).where(address.company.isNotNull())

或者更好的地方如果:

boolean addWhereClause = false; 
QAddress address = QAddress.address; 
JPQLQuery query = new JPAQuery(getEntityManager()); 
query.from(address)
     .whereIf(addWhereClause, address.company.isNotNull())

到目前为止我唯一发现的是使用BooleanBuilder,但我认为有更好的方法(比如上面的伪代码)。

亲切的问候,土工

java querydsl
2个回答
11
投票

它应该像这样工作

boolean addWhereClause; 
QAddress address = QAddress.address; 
JPQLQuery query = new JPAQuery(getEntityManager()); 
query.from(address);    
if (addWhereClause) {
    query.where(address.company.isNotNull());
}

要么

boolean addWhereClause; 
QAddress address = QAddress.address; 
JPQLQuery query = new JPAQuery(getEntityManager()); 
query.from(address)
     .where(addWhereClause ? address.company.isNotNull() : null);

0
投票

我找到了另一个解决方案来获得更紧凑的代码,你只需编写一个新的略微修改的BooleanBuilder。实际上你只需要让每个方法都返回一个布尔值而不是BooleaBuilder(你放松了链接的可能性),但这里是你得到的:

TworkBooleanBuilder tworkBuilder = new TworkBooleanBuilder();

boolean foo = isNotBlank(title) && tworkBuilder.and(QBook.book.title.containsIgnoreCase(title));
foo = isNotBlank(isbn) && tworkBuilder.and(QBook.book.isbn.containsIgnoreCase(isbn));
foo = before != null && tworkBuilder.and(QBook.book.date.before(before));
foo = after != null && tworkBuilder.and(QBook.book.date.after(after));

如果StringUtils.isNotBlank(str)返回true,则java会继续评估&&的正确部分。因此,只有当“title”不为null时,“where”子句才会添加“and”谓词:QBook.book.title.containsIgnoreCase(title)

当然“foo”是没用的,只是为了让java编译和评估表达式

© www.soinside.com 2019 - 2024. All rights reserved.