Java 如何使用querydsl动态添加where子句?
我已经在文档上查找了一段时间,并尝试了几种方法,但无法使用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
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));