java UNION到JPA查询

j1dl9f46  于 2023-01-29  发布在  Java
关注(0)|答案(8)|浏览(667)

是否可以在JPA甚至“Criterion Builder”中查询“UNION”?
我正在找例子,但到目前为止还没有结果。
有没有人能举个例子来说明如何使用它?
或者是原生sql?

r6vfmomb

r6vfmomb1#

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

dzhpxtsq

dzhpxtsq2#

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

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'
)
yqlxgs2m

yqlxgs2m3#

有一件事刚刚进入我的脑海(搜索完全相同的问题):
对同一个实体Map执行两个不同的JPA查询,只需将第二个结果的对象添加到第一个结果的列表(或集合以避免重复)中。
这样就可以获得与UNION相同的效果,不同之处在于使用了两个SQL语句而不是一个,但实际上,我希望它的性能与发出一个UNION语句一样好。

zaqlnxep

zaqlnxep4#

写入本地查询(设置为true,默认为false)-例如:

String findQuery = "select xyz from abc union select abc from def"
@Query(value = findQuery, nativeQuery = true)
//method
osh3o9ms

osh3o9ms5#

使用实体管理器。创建本机查询(...);它允许您使用UNION

czfnxgou

czfnxgou6#

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.

这对我帮助很大,我希望这是他们正在寻找的,或者这对他们有好处。

pcww981p

pcww981p7#

我已经在我的项目中解决了这个问题。

如果将其更改为本机查询并按如下方式使用,则Union/Union All将起作用

//In Your Entity class
@NamedNativeQuery(name="EntityClassName.functionName", 
query="your_native_query")

//In your Repository class
@Query(native=true)
List<Result> functionName();

以下在JPA存储库中定义本机查询的方法无法解决此问题

@Query(value="your_native_query", native=true)

不会

jhdbpxl9

jhdbpxl98#

您可以在查询中直接使用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();

相关问题