1

我正在尝试使用自然 ID 列表创建休眠标准。我在这里看到了示例 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 中表达这一点时,它会变得很棘手......

不支持跨数据库的伪 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 回答