質問

少ないコード以外に、Hibernate Criteria APIを使用してIN句を構築するための次の2つのアプローチの違いは何ですか?パフォーマンスの懸念はありますか?取得に私が欠けているいくつかのロジックはありますか?どちらも、列が返された限り同じように機能しているようです。

Disjunction disj = Restrictions.disjunction();
for (String value : stringArray) {
     disj.add(Restrictions.eq("code", value));
}
where.add(disj);

vs。

Restrictions.in("code", stringArray);

私が尋ねる理由は、前者が存在するレガシーコードをリファクタリングしているからですが、後者を期待していたからです。どちらも同じ場合、レガシーコードのみを残します。

役に立ちましたか?

解決

冬眠 分離 に慣れている

      Group expressions together in a single disjunction

つまり、値xまたはyまたはzと比較する必要がある場合、 条件付き, 、繰り返して適用することができます 選択的分離

理想的にはあなたの場合です 制限制限 同じことをします、私はこの場合は前者を好みます。

他のヒント

制限は、明示的な制御を提供します。たとえば、オペレーターのようにオペレーターのように、そうでないようにオペレーターのように許可します。

例えば:

criteria.add(Restrictions.disjunction()
                        .add(Restrictions.eq("bill.stateCd", null))
                        .add(Restrictions.eq("bill.stateCd", ""))
                        .add(Restrictions.ilike("bill.stateCd","%"+stateCd+"%")));

で達成できません

criteria.add(Restrictions.in("bill.stateCd", Arrays.asList(null,"", "%"+stateCd+"%")));

指定されたコードでは、これら2つの動作は非常に異なって動作します stringArray ゼロ要素があります。

ゼロ式で分離を使用すると、有効なSQLクエリが生成されます 1=1 または同等の。

Restrictions.in 値のないオペレーターにつながるが、多くの場合(おそらくSQL方言がそれを処理できるかもしれない)構文的に間違っている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top