12

CustomerQueryInfo次のプロパティを持つBean があるとします。

  • 文字列 firstName
  • 文字列姓
  • StatusEnum ステータス

顧客のリストを返すこのタイプのオブジェクトを使用して、「 QueryDSL 」検索を実行したいと考えていますList<Customer>

のフィールドの 1 つが である場合CustomerQueryInfonull検索で使用したくありません。したがって、 3 つのフィールドCustomerQueryInfoすべてが に設定されたオブジェクトは、すべての customersを返します。null

このような検索を QueryDSL で実行するためのベスト プラクティスを探しています。

このようなものはOKです:

private BooleanExpression isFirstNameLike(String firstName){
    if(firstName==null)
        return true BooleanExpression somehow;
    return QCustomer.customer.firstName.like(firstName);
}

private BooleanExpression isStatutEq(StatusEnum status){
    if(status==null)
        return true BooleanExpression somehow;
    return QCustomer.customer.status.eq(status);
}

それから:

return query.from(customer).where(isFirstNameLike(customerQueryInfo.getFirstName).and(isLastNameLike(customerQueryInfo.getLastName).and(isStatusEq(customerQueryInfo.getStatus))).list;
  1. BooleanExpressiontrue と評価されるa を返すにはどうすればよいですか?
  2. 上記のアプローチが適切でない場合、推奨されるベスト プラクティスは何ですか?
4

5 に答える 5

22

このようなnull述語を安全に使用できます

private BooleanExpression isFirstNameLike(String firstName){
    return firstName != null ? customer.firstName.like(firstName) : null;        
}

private BooleanExpression isStatusEq(StatusEnum status){
    return status != null ? customer.status.eq(status) : null;
}

そして、whereの可変引数の側面を使用します

query.from(customer)
     .where(
         isFirstNameLike(customerQueryInfo.getFirstName()),
         isLastNameLike(customerQueryInfo.getLastName()),
         isStatusEq(customerQueryInfo.getStatus()))
     .list(customer);
于 2012-09-05T17:51:48.803 に答える
6

式を追加する前に 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:34:56.140 に答える