2013-09-23 54 views
9

是否有可能在JPA中查询“UNION”甚至是“Criteria Builder”?联盟到JPA查询

我找实例,但到目前为止,我没有得到结果。

有谁对如何使用它的例子吗?

或者会与本机SQL?

+0

可能重复http://stackoverflow.com/questions/9104989/union-all-and-sum-with-jpa-criteriabuilder ) – danizmax

回答

15

SQL支持UNION,但JPA 2.0 JPQL不支持。大多数工会可以通过连接来完成,但有些不能,有些则更难以使用连接来表达。

但是,EclipseLink支持UNION。所以,使用EclipseLink而不是JPA。

+1

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#UNION链接EL文档举例 – Chris

15

根据具体情况,可以使用子查询,像:

select e 
from Entity e 
where e.id in 
(
    select e.id 
    from Entity2 e2 
     join e2.entity e 
    where e2.someProperty = 'value' 
) 
     or e.id in 
(
    select e.id 
    from Entity3 e3 
     join e3.entity e 
    where e3.someProperty = 'value2' 
) 
+0

如何处理情况下,如果在子查询中有超过1000个结果? – user613114

+0

对于MS SQL,实际上它超过了2000,这并没有改变它不起作用的事实。 您可以获取所有这些ID,然后按您想要设置的限制对结果列表进行分区,然后对所有子列表执行查询并加入结果。考虑到JPA的工作方式并不是那么糟糕,但一如既往,这取决于您的使用案例。 – szczepanpp

+0

甚至没有提到UNION的某些用法是关于避免OR(调整SQL性能时)。我个人有一个子表达式,或者非常慢。重写使用联合后,它变得更快。现在,我必须找到一个解决方案与CriteriaBuilder :( – takacsot

4

一件事只是我想到(搜索完全相同的问题):

执行两个不同的JPA查询在相同的实体映射上,并简单地将第二个结果的对象添加到第一个结果的列表(或设置为避免重复)。

你会得到相同的效果与UNION这样一来,不同之处在于你用两个SQL语句,而不是一个。但实际上,我希望能够像发出一个UNION声明一样好。

+1

天才的使用!应该算是最好的答案,直到JPQL支持工会 –

+0

那么,这是显而易见的解决方法之一,但我也想订购的结果一起例如,我更喜欢这样做在SQL比Java的 – kopelitsa

+0

但是,这不是问题,kopelitsa,你可以随时使用SQL,使意见。 – cslotty

0

您可以在查询中直接使用UNION。 以下查询返回来自FRIENDSHIP表的朋友的ID。

如:

TypedQuery<String> queryFriend = em.createQuery("SELECT f.Id FROM Friendship f WHERE f.frStuId = :stuId UNION " 
           + "SELECT f.frStuId FROM Friendship f WHERE f.FriendId = :stuId", String.class); 
queryFriend.setParameter("stuId", stuId); 

List<String> futureFriends = queryFriend.getResultList(); 
[UNION ALL和点心与JPA CriteriaBuilder(的
+0

Errm nope。JPQL没有“UNION”,因为所有的答案都告诉你.JPA提供者接受的唯一方法就是它提供了卖方扩展。并且OP已经说过使用JPA提供程序了吗?不。 – DN1