【问题标题】:Hibernate Criteria object - perform a INTERSECTHibernate Criteria 对象 - 执行 INTERSECT
【发布时间】:2011-09-12 18:58:06
【问题描述】:

我想知道他们是否可以使用 Criteria API 对象轻松执行 oracle INTERSECT。

使用休眠 3.2

前。我想要名称为 dora 和 diego 的“表”中存在的所有 t.value。

SELECT t.value from table t where t.name = 'Dora'

相交

从表 t 中选择 t.value,其中 t.name = 'Diego'

我想我将不得不使用 Restriction sqlRestriction 或编写一个称为执行此操作的 oracle 存储过程。还有其他建议吗?

解决方案 1:

    Session sessionFactory = sessionFactory.getCurrentSession();         
    String intersetSQLQuery = "SEE QUERY STRING BELOW";     
    SQLQuery query = sessionFactory.createSQLQuery( intersetSQLQuery );
    query.addScalar( hibernate_mapped_field_name,Hibernate.STRING);
    //Returns a list of string objects
    nameList = query.list();

【问题讨论】:

    标签: hibernate criteria-api


    【解决方案1】:

    目前似乎不支持相交。见https://hibernate.onjira.com/browse/HHH-1050

    你也许可以逃脱类似的事情

    select t.value from table t 
    where t.name = 'Diego' 
    and t.value in 
        (select t1 from table t1 
         where t1.name = 'Dora')
    

    【讨论】:

    • 谢谢!这确实有效,并且它在 oracle 数据库中的性能也比 INTERSECT 更好。这个查询几乎是 INTERSECT 的两倍。真的很惊讶没有办法在Hibernate中做到这一点。虽然我更正了,但其中有一个错字。第 3 行你有 'and t in' 应该是 'and t.value in'
    • 有趣的编辑。你在考虑这个 SQL 还是 HQL?我要使用 HQL,在这种情况下,我会将其保留为 and t in,其中子选择正在选择类型表的实例。否则,您会希望子选择选择 t1.value 而不是 t1 以便它与您的 t.value 匹配(我假设它是唯一的?)无论如何,您比我更了解您的架构,所以我批准了您的修改。
    • 是的,我确实使用了本机 sql。我在上面发布了解决方案。没有尝试使用 HQL。
    【解决方案2】:

    为什么不只是:

    select  t.value from table t where t.name in ('Diego', 'Dora' ) 
    
    • 就这样。

    永远不要忽略 sql 的强大功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2011-02-05
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2011-10-28
      相关资源
      最近更新 更多