6

さまざまなエンティティの日付を検索するクエリを作成したいと思います。私の構造は次のとおりです。

  • 契約には日付があります(null不可)
  • 従業員に日付があります(null不可)
  • 従業員は契約IDを持っている可能性があります(null可能)

従業員が契約を結んでいる場合、契約日を取得したいと思います。従業員が契約を結んでいない場合は、従業員の日付を返したいと思います。

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

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を見たので、おそらくそれがより良い解決策かもしれません。

どんなポインタも大いに受け取られるでしょう。

ありがとう

4

2 に答える 2

3

あなたがしたいことはCase<Date>、を使用Predicateし、の最初の引数としてのみ使用することだと思いますCase#whenCase<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"))
);
于 2016-09-29T16:06:29.347 に答える