1

自然IDのリストを使用してHibernate基準を作成しようとしています。ここで例を見ました http://docs.jboss.org/hibernate/core/3.5/reference/en-US/html/querycriteria.html#query-criteria-naturalidが、単一のレコードをクエリするための例のみを示しています。

session.createCriteria(User.class)
  .add(Restrictions.naturalId()
    .set("name", "gavin")
    .set("org", "hb"));

以下の例よりも、自然IDのリストの基準を作成するためのより良い方法はありますか?

Junction junction = Restrictions.disjunction()
  .add(Restrictions.naturalId()
    .set("name", "gavin")
    .set("org", "hb"))
  .add(Restrictions.naturalId()
    .set("name", "jdoe")
    .set("org", "rh"));         
session.createCriteria(User.class)
  .add(junction);

ありがとう。

4

1 に答える 1

2

私の経験では、違います。その理由は、一部の実装ではSQLの制限によるものです。これをSQLで表現しようとすると、注意が必要になります...

クロスDBでサポートされていない疑似SQL...

select * from table where (name, org) in values ( ('gavin', 'hb'), ('jdoe', 'hr'))

Hibernateが最終的に作成するのは、一般的なクロスDBの方法です...

select * from table where (name = 'gavin' and org = 'hr') OR (name = 'jdoe' and org = 'hr')

私はこの質問に賛成し、私が間違っていてより良い方法があることを期待して追跡するために私のお気に入りに追加しました。DB2 for zOSでは、この奇妙なことがオプティマイザーの選択を悪くする原因にもなっていることを私は知っています。

于 2013-02-07T03:35:01.630 に答える