【问题标题】:HQL merge two typedqueriesHQL 合并两个类型化查询
【发布时间】:2013-07-30 19:26:52
【问题描述】:

我写了两个休眠查询:

  1. TypedQuery q = em.createQuery("SELECT user.id FROM TableOne AS user WHERE ...", Long.class);
  2. TypedQuery q = em.createQuery("SELECT link.user_id FROM TableTwo AS link WHERE ...", Long.class);

现在,如何合并这两个查询?我的返回类型必须是 TypedQuery

【问题讨论】:

  • SQL 等价的应该是 Union 语句吧? JPQL 不支持此类,尽管一些 JPA 提供程序支持。为什么需要将查询合并到一个 TypedQuery 中?你不能同时执行并返回一个 Set 包装到另一个方法中吗?
  • 如何使用等效的 SQL 来返回 TypedQuery?跟随工作吗? TypedQuery q = em.createQuery("SELECT user.id FROM TableOne AS user WHERE ... UNION SELECT link.user_id FROM TableTwo AS link WHERE ...", Long.class);

标签: java spring hibernate hql


【解决方案1】:

UNION 语句不适用于 Hibernate。

所以你可以:

执行第一个查询并放入一个列表;

执行第二个查询并放入一个列表;

将第一个和第二个列表的结果放在一个唯一的列表中。

如果要删除重复值,必须以编程方式进行。

【讨论】:

    【解决方案2】:

    完全复制https://stackoverflow.com/a/3940445/929701的答案:

    您可以使用 id in (select id from ...) 或 id in (select id from ...)

    例如而不是不工作

    from Person p where p.name="Joe"
    union
    from Person p join p.children c where c.name="Joe"
    

    你可以的

    from Person p 
      where p.id in (select p1.id from Person p1 where p1.name="Joe") 
        or p.id in (select p2.id from Person p2 join p2.children c where c.name="Joe");
    

    至少在使用 MySQL 时,你会遇到后者的性能问题。有时在两个查询上做一个穷人的连接会更容易:

    // use set for uniqueness
    Set<Person> people = new HashSet<Person>((List<Person>) query1.list());
    people.addAll((List<Person>) query2.list());
    return new ArrayList<Person>(people);
    

    执行两个简单的查询通常比执行一个复杂的查询要好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2012-09-02
      • 2011-09-27
      相关资源
      最近更新 更多