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

Java 如何使用querydsl动态添加where子句?,java,querydsl,Java,Querydsl,我已经在文档上查找了一段时间,并尝试了几种方法,但无法使用querydsl动态添加where子句: 伪代码,我需要类似“如果”的东西: 或者,如果: boolean addWhereClause = false; QAddress address = QAddress.address; JPQLQuery query = new JPAQuery(getEntityManager()); query.from(address) .whereIf(addWhereClause, a

我已经在文档上查找了一段时间,并尝试了几种方法,但无法使用querydsl动态添加where子句:

伪代码,我需要类似“如果”的东西:

或者,如果:

boolean addWhereClause = false; 
QAddress address = QAddress.address; 
JPQLQuery query = new JPAQuery(getEntityManager()); 
query.from(address)
     .whereIf(addWhereClause, address.company.isNotNull())
到目前为止,我唯一发现的是使用BooleanBuilder,但我认为有更好的方法(如上面的伪代码)

亲切问候,,
soilworker

它应该是这样工作的

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


我找到了另一个解决方案来获得更紧凑的代码,您只需编写一个新的稍微修改过的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编译和计算表达式

if(addwhere子句){query.from(address.).where(address.company.isNotNull())}else{query.from(address);}这是唯一的方法吗?我正在寻找一个更“紧凑”的形式来实现这一点。让我们假设我必须用50个这样的addWhere子句条件构建查询。50这样的if/else构造不是很好;query=addwhere子句?query.where(address.company.isNotNull()):查询;对我来说,这和if/else是一样的:)有没有其他方法来实现这一点?让我们假设我有50个这样的where子句,我想动态添加它们。50个if的可读性不是很好,并且我构建这个查询的方法增加了很多复杂性。一个方法查询。whereIf(布尔,谓词…)或者类似的东西将是一个很棒的特性。在我们的项目中,构建了很多动态查询,如果我必须为此使用if构造,那么当我将querydsl引入我们的项目时,我并没有得到真正的好处。if变量的好处是,如果不满足条件,表达式将永远不会被计算,whereIf模式没有这种保证,例如whereIf(arg!=null,…)可能导致使用NPEI编辑的“我的答案”构造表达式,以提供如何正确自定义查询类的示例。@soilworker我现在添加了一个与原始请求接近的变体。
boolean addWhereClause; 
QAddress address = QAddress.address; 
JPQLQuery query = new JPAQuery(getEntityManager()); 
query.from(address)
     .where(addWhereClause ? address.company.isNotNull() : null);
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));