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

1

式を追加する前に null チェックを行う静的メソッドを持つ QueryDSLHelper クラスを作成します。このようなもの:

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));
    }
}

これで、これらのメソッドを静的にインポートして、1 行で呼び出すことができます。

        like(builder, book.isbn, isbn);

これは、'filter' または 'filterByExample' クエリを実装するときに非常に便利で、非常にクリーンで読みやすいものです。

于 2014-06-13T01:32:04.223 に答える