我一直在寻找文档的一些时间,并尝试了几件事,但我无法动态添加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,但我认为有更好的方法(比如上面的伪代码)。
亲切的问候,土工
它应该像这样工作
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);
我找到了另一个解决方案来获得更紧凑的代码,你只需编写一个新的略微修改的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编译和评估表达式