【问题标题】:Hibernate criteria by a list of natural ids通过自然 ID 列表休眠条件
【发布时间】:2013-02-07 03:04:43
【问题描述】:

我正在尝试使用自然 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);

谢谢。

【问题讨论】:

    标签: hibernate criteria


    【解决方案1】:

    根据我的经验,不会。原因是由于 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 中,这种奇怪的情况也会导致优化器做出糟糕的选择。

    【讨论】:

    • 感谢您的解释:)
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多