41

是否可以在 JPA 甚至“Criteria Builder”中查询“UNION”?

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

有没有人有任何如何使用它的例子?

还是使用本机sql?

4

7 回答 7

41

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

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'
)
于 2014-08-05T09:36:12.000 回答
41

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

EclipseLink 支持 UNION。

于 2013-09-23T12:04:30.800 回答
13

我想到了一件事(寻找完全相同的问题):

对同一个实体映射执行两个不同的 JPA 查询,只需将第二个结果的对象添加到第一个结果的列表(或设置以避免重复)。

这样您就可以获得与使用 UNION 相同的效果,不同之处在于您使用两个 SQL 语句而不是一个。但实际上,我希望它的性能与发布一个 UNION 语句一样好。

于 2016-08-16T14:22:45.347 回答
8

编写本机查询(将其设置为 true ,默认为 false) - 例如。

String findQuery = "select xyz from abc union select abc from def"
@Query(value = findQuery, nativeQuery = true)
//method
于 2019-02-15T23:28:45.580 回答
1

使用 EntityManager.createNativeQuery(...); 它允许你使用 UNION

于 2018-06-21T06:32:57.110 回答
0

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);

Esto es muy útil para que la lista de tareas devueltas tenga paginación。

taskRepository.findAll(specificationFullJoin, pageable).map(TaskResponse::new); //Here you can continue adding filters, sort or search.

它对我有很大帮助,我希望这是他们正在寻找的东西,或者它为他们服务。

于 2019-03-22T15:03:01.547 回答
-4

您可以在查询中直接使用 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();
于 2017-03-30T12:22:53.993 回答