2

次のようにサブセレクトを使用して、Hibernate Criterion を構築しています

DetachedCriteria subselect =
    DetachedCriteria.forClass(NhmCode.class, "sub"); // the subselect selecting the maximum 'validFrom'
subselect.add(Restrictions.le("validFrom", new Date())); // it should be in the past (null needs handling here)
subselect.add(Property.forName("sub.lifeCycle").eqProperty("this.id")); // join to owning entity
subselect.setProjection(Projections.max("validFrom"));  // we are only interested in the maximum validFrom

Conjunction resultCriterion = Restrictions.conjunction();
resultCriterion.add(Restrictions.ilike(property, value)); // I have other Restrictions as well
resultCriterion.add(Property.forName("validFrom").eq(subselect)); // this fails when validFrom and the subselect return NULL

return resultCriterion;

ここまでは問題なく動作しますが、return ステートメントの前の最後の行の制限は、validFrom と subselect が NULL になると false になります。

私が必要としているのは、このケースを true として処理するバージョンです。おそらく、NVL や合体などを適用することによって。

どうすればいいですか?

アップデート: - - - - - - - - - - - - - -

sqlRestriction を使用した Peters のアイデアは、次のような where 句になります。

        ...
        and (
            nhmcode1_.valid_from = (
                select
                    max(sub_.valid_from) as y0_ 
                from
                    nhm_code sub_ 
                where
                    sub_.valid_from<=? 
                    and sub_.lc_id=this_.id
            ) 
            or (
                nhmcode1_.valid_from is null 
                and sub.validFrom is null
            )
        )
        ...

その結果、次のようになります。

ORA-00904: "SUB_"."VALIDFROM": 不明な点があります

「無効な識別子」を意味するエラー メッセージ

4

2 に答える 2

5

問題のある行の代わりに、次のようなものを試すことができます。

resultCriterion.add(
  Restrictions.or(
    Restrictions.and(
      Restrictions.isNull("validFrom"),
      Restrictions.sqlRestriction("sub.validFrom is null")
    ),
    Property.forName("validFrom").eq(subselect)
  )
);

これはすぐにはうまくいかないかもしれませんが、うまくいけば役に立ちます。

于 2010-04-07T15:20:44.790 に答える
0

これは Criteria API のもう 1 つの制限のようです。

この種の独自の基準 (または基準のセット) を作成することは、実際にはそれほど難しくないことがわかりました。

最大の問題は、基本的にドキュメントなしで行かなければならないことです。あなたがやりたいことに似ているいくつかの実装をつかみます。それをひねり、それが生成するSQLを確認し、すすぎ、繰り返します。

面白くありませんが、うまくいきます。

申し訳ありませんが、質問の問題に使用できる実装がありません。

于 2010-06-09T20:49:20.787 に答える