2012-11-23 6 views
5

FilfetDtoを使用して動的クエリを構築しています ユーザーがUIの一部のフィールドを埋めると、 だから私は唯一の(空でない)充填のクエリフィルタを構築するために、各プロパティをテストする必要がフィールド:動的QueryDSLで構文を単純化し、複数の "if"を避ける方法

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

は別の、より読みやすい構文で「もし」を抽象化する方法はありますか?

私が何か希望:

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

答えて

3

抽象化への道は、別のより読みやすい構文で「場合」はありますか?

いいえ、おそらく存在しません。 Querydsl式の目的は、基礎となる永続性テクノロジによって使用されるフォームの近くにとどまることです。

独自のプロジェクトでこのようなアプローチを使用したい場合は、これをAbstractJPAQueryの独自のサブクラスに自由に入れてください。 Querydslクエリは、そのような場合にカスタマイズするためのものです。

1

私は式を追加する前にヌルチェックを行う静的メソッドを持つ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行にそれらを呼び出すことができます:「フィルタ」や「filterByExampleを実装する際にこれがリード/非常に便利な、非常にきれいである

 like(builder, book.isbn, isbn); 

'クエリ。

関連する問題