Java 联合到JPA查询

Java 联合到JPA查询,java,jpa,criteria,Java,Jpa,Criteria,可以在JPA中查询“UNION”甚至“Criteria Builder”吗 我正在寻找例子,但到目前为止,我没有得到任何结果 有人举过如何使用它的例子吗 或者说,原生sql支持UNION,但JPA2.0JPQL不支持。大多数联合都可以通过连接来实现,但有些不能,有些更难以使用连接来表达 EclipseLink支持联合。根据具体情况,可以使用子查询,例如: select e from Entity e where e.id in ( select e.id from Entity2 e2

可以在JPA中查询“UNION”甚至“Criteria Builder”吗

我正在寻找例子,但到目前为止,我没有得到任何结果

有人举过如何使用它的例子吗


或者说,原生sql支持UNION,但JPA2.0JPQL不支持。大多数联合都可以通过连接来实现,但有些不能,有些更难以使用连接来表达


EclipseLink支持联合。

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

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查询,只需将第二个结果的对象添加到第一个结果的列表中(或设置为避免重复)


通过这种方式,您可以获得与联合相同的效果,不同之处在于您使用了两个SQL语句而不是一个SQL语句。但实际上,我希望它的性能与发出一条UNION语句一样好。

您可以在查询中直接使用UNION。 下面的查询返回友谊表中朋友的id

例如:

typedqueryqueryfriend=em.createQuery(“从友谊中选择f.Id,其中f.frStuId=:stuId UNION”
+“从友谊f中选择f.frStuId,其中f.FriendId=:stuId”,String.class);
setParameter(“stuId”,stuId);
List futureFriends=queryFriend.getResultList();

使用EntityManager.createNativeQuery(…); 它允许您使用UNION编写本机查询(设置为true,默认为false)-例如


JPA没有直接的联盟,我所做的是构建两个规范

Specification<Task> specification = Specification.where(null);
Specification<Task> specification2 = Specification.where(null;
对于本例,它是一个任务表,在第一个规范中,我需要启用和禁用当前月份的任务,在第二个规范中,我只需要启用前几个月的任务

Specification<Task> specificationFullJoin = Specification.where(specification).or(specification2);

这对我帮助很大,我希望这是他们正在寻找的,或者它能为他们提供一些服务。

链接到EL文档,并举例说明如何处理子查询中超过1000个结果的情况。对于MS SQL,它实际上超过2000个,这并不能改变它无法工作的事实。您可以获取所有这些id,然后按照要设置的限制对结果列表进行分区,然后对所有子列表和联接结果执行查询。考虑到JPA的工作方式,这并不是那么糟糕,但是,一如既往,这取决于您的用例。更不用说UNION的某些用法是为了避免或(在调优SQL性能时)使用。我个人有一个很慢的子表达式。在重写为使用union后,速度变得更快。现在,我必须找到一个解决方案来使用CriteriaBuilder构建它:(此“或”解决方案可能会导致阻止某些索引的使用,不幸的是,超过1000个值的问题(可以配置)不适用于Oracle中的子查询。它仅在使用参数时发生。genius!!!应该被视为最佳答案,直到JPQL支持unionsWell,这是一个明显的解决方法,但我也希望将结果排序在一起,例如,我更喜欢在sql中而不是在Java中执行此操作,但这不是问题,kopelitsa,和您可以始终使用SQL并创建视图。我不同意。@Giovan询问是否可以在JPA中执行联合,并且可以在SQL视图中完成联合的事实与此无关。并非所有JPA用例都有权要求数据库所有者在其数据库中创建视图。但我们无法进行分页。Errm nope.JPQL没有“联合”正如所有答案所告诉你的。JPA提供商接受这一点的唯一方式是提供供应商扩展。OP有没有说明使用了什么JPA提供商?没有。是的,我不知道为什么会被否决,但这是一个非常有效的选择,尤其是在性能方面。@Motolola可能是因为答案是关于JPA的,而不是关于本机的询问?
Specification<Task> specification = Specification.where(null);
Specification<Task> specification2 = Specification.where(null;
specification = specification.and((root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(criteriaBuilder.function(MONTH, Integer.class, root.get("deliveryExpirationDate")), month));
        specification2 = specification2.and((root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.lessThan(criteriaBuilder.function(MONTH, Integer.class, root.get("deliveryExpirationDate")), month))
            .and((root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("enable"), true));
Specification<Task> specificationFullJoin = Specification.where(specification).or(specification2);
taskRepository.findAll(specificationFullJoin, pageable).map(TaskResponse::new); //Here you can continue adding filters, sort or search.