gpt4 book ai didi

querydsl - 如何使用动态 QueryDSL 简化语法,避免出现多个 "if"

转载 作者:行者123 更新时间:2023-12-02 21:58:37 26 4
gpt4 key购买 nike

我正在使用 FilfetDto 构建动态查询如果用户填写了 UI 中的某些字段,则该字段将包含一些值,但不是全部。所以我必须测试每个属性以仅在填充(非空)字段上构建查询过滤:

    JPAQuery dslQuery = new JPAQuery(em);

dslQuery.from(book);
dslQuery.join(book.author, author);

String title = StringUtils.upperCase(StringUtils.trim(_filter.getTitle()));
if (StringUtils.isNotBlank(title)) {
dslQuery.where(book.title.upper().like(title));
}
String isbn = StringUtils.trim(_filter.getIsbn());
if (StringUtils.isNotBlank(isbn)) {
dslQuery.where(book.isbn.like(isbn));
}
if (_filter.getAuthorId() != null) {
dslQuery.where(author.id.eq(_filter.getAuthorId()));
}

有没有办法用另一种更易读的语法来抽象“if”?

我想要类似的东西:

    JPAQuery dslQuery = new JPAQuery(em);

dslQuery.from(book);
dslQuery.join(book.author, author);

dslQuery.where(book.title.upperIfNotBlank().like(title));
dslQuery.where(book.isbn.likeIfNotNull(isbn));
dslQuery.where(author.id.eqIfNotNull(_filter.getAuthorId()));

如果可以打开“IfNotNull”,甚至是默认行为,那就太好了......
所以它最终会像这样:

    dslQuery.where(book.title.upper().like(title));
dslQuery.where(book.isbn.like(isbn));
dslQuery.where(author.id.eq(_filter.getAuthorId()));

最佳答案

Is there a way to abstract the "if" with another more readable syntax ?

不,也许不会。 Querydsl 表达式的目标是尽可能接近底层持久性技术所使用的形式。

如果您想在自己的项目中使用这种方法,请随意将其放入您自己的 AbstractJPAQuery 子类中。 Querydsl 查询旨在针对此类情况进行定制。

关于querydsl - 如何使用动态 QueryDSL 简化语法,避免出现多个 "if",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com