UNION到JPA查询
是否可以在JPA甚至“Criteria Builder”中查询“UNION”?
我正在寻找例子,但到目前为止我没有结果。
有没有人有任何使用它的例子?
或者是原生sql?
SQL支持UNION,但JPA 2.0 JPQL不支持。 大多数联合可以在连接方面完成,但有些不能,有些则更难以使用连接来表达。
但是,EclipseLink支持UNION。 因此,使用EclipseLink而不是JPA。
根据具体情况,可以使用子查询,例如:
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' )
我想到了一件事(寻找完全相同的问题):
对同一实体映射执行两个不同的JPA查询,并简单地将第二个结果的对象添加到第一个结果的列表(或设置为避免重复)。
这样你就可以获得与UNION相同的效果,不同之处在于你使用两个SQL语句而不是一个。 但实际上,我希望它的表现与发布一个UNION语句一样好。
SQL支持UNION,但JPA 2.0 JPQL不支持。 [Masudul]
解决此问题的一种方法是通过执行多个查询并将每个查询添加到结果集中这可能会更慢,但这是一个简单的解决方案:
Query query = em.createQuery("SELECT p FROM Person p WHERE title = theTitle", Person.class); Query query2 = em.createQuery("SELECT p FROM Person p WHERE firstName = theFirstName", Person.class); List list = query.getResultList(); List list2 = query2.getResultList(); LinkedHashSet result = new LinkedHashSet (); result.addAll(list); result.addAll(list2); //fun with result
使用EntityManager.createNativeQuery(…); 它允许你使用UNION
您可以在查询中直接使用UNION。 以下查询返回FRIENDSHIP表中的朋友ID。
例如:
TypedQuery 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 futureFriends = queryFriend.getResultList();