2012-04-19 47 views
1

異なるエンタテイメントで日付を検索するクエリを作成したいとします。私の構造は次のとおりです。JPA Criteria Builderの/ Case文の場合

  • 契約は、日付(非NULL可能)
  • 従業員は、従業員が持っている場合は、従業員が契約ID(NULL可能)

を有していてもよく、日付(非NULL可能)

  • を持っていますcontract契約日を取得したい従業員に契約がない場合、従業員の日付を返すことにします。

    これまでの私のコードは次のとおりです。

    if (inputDate!= null) { 
        ParameterExpression<Date> exp = criteriaBuilder.parameter(Date.class, "inputDate"); 
        criteria.add(criteriaBuilder.or(
         criteriaBuilder.isNull(employee.get("contract")), 
         criteriaBuilder.lessThanOrEqualTo(employee.<Date>get("creationDate"), exp), criteriaBuilder.lessThanOrEqualTo((employee.join("contract").<Date>get("fromDate")), exp)));} 
    

    これがが動作するようには思えません。私は常に私が期待していないisNullに入るように見えます。

    私はこれをもう少し詳しく見ていきたいと思いますが、私の質問は、これが正しい方法かどうかということです。それは...ですか?私はcriteriaBuilderの中でもselectCaseを見てきました。おそらくそれがより良い解決策かもしれません。

    すべてのポインタが大きく受信されます。ここで

    おかげ

  • 答えて

    3

    は、それが動作するかどうか確認してください解決策ではないだろうが、我々は:)それはあなたの助けを借りて仕事を得るために管理します。

    ParameterExpression<Date> inputDateExp = criteriaBuilder.parameter(Date.class, "inputDate"); 
    Predicate employeeCreationDate = criteriaBuilder.lessThanOrEqualTo(
         employee.<Date>get("creationDate"), inputDateExp); 
    Predicate contractStartDate = criteriaBuilder.lessThanOrEqualTo(
         employee.join("contract").<Date>get("fromDate"), inputDateExp); 
    
    criteria.add(
         criteriaBuilder.selectCase().when(employee.get("contract").isNull(), employeeCreationDate).otherwise(contractStartDate)); 
    

    「inputDateを使用する理由私は理解していません"日付の代わりに式として?また、criteriacに、criteriaBuildercbに改名することをお勧めします。これでスペースが節約され、より快適になると思います。

    +0

    こんにちはJMelnik、ありがとうございます。私がこのコードで持っている問題は、selectCaseが述語ではなく式を返すことです。実際に述語を返すので、述語全体を大文字小文字に変換しようとしました。残念ながら、私はキャストしているので、私は奇妙に見えるのはまだコンパイルされません。これが何であるか知っていますか?ありがとう – RNJ

    +0

    @ user846476私たちが行う必要があるのは、ケースステートメントの日付と日付を比較することだと思います。 – JMelnik

    0

    あなたがしたいことは、Case<Date>を使用し、の最初の引数としてPredicateを使用することだと思います。 Case<Date>Expression<Date>です。これはCriteriaQuery#multiselectに渡したいものです。

    CriteriaQuery<Employee> query = criteriaBuilder.createQuery(Employee.class); 
    Root<Employee> employee = query.from(Employee.class); 
    query.multiselect 
    (
        criteriaBuilder.selectCase() 
         .when(criteriaBuilder.isNull(employee.get("contract")), employee.get("creationDate")) 
         .otherwise(employee.join("contract").get("fromDate")) 
    ); 
    
    関連する問題