5

我正在使用 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()));
4

2 回答 2

3

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

不,而且可能不会有。Querydsl 表达式的目的是尽可能接近底层持久性技术使用的形式。

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

于 2012-11-23T21:49:23.953 回答
1

我创建了一个 QueryDSLHelper 类,该类具有在添加表达式之前执行 null 检查的静态方法。像这样的东西:

public static void goe(BooleanBuilder builder, DateTimePath<Date> path, Date value) {
    if(date!=null) {
        builder.and(path.goe(value));
    }
}

public static void like(BooleanBuilder builder, StringPath path, String value) {
    if(value!=null) {
        builder.and(path.like(value));
    }
}

现在我可以静态导入这些方法并在一行中调用它们:

        like(builder, book.isbn, isbn);

这在实现 'filter' 或 'filterByExample' 查询时非常有用且非常干净/易读。

于 2014-06-13T01:32:04.223 回答