java—当我在多种情况下需要连接时,spring(boot)规范是如何工作的?

9vw9lbht  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(276)

所以我有一个sql查询,比如:

SELECT stuff
FROM a
  JOIN x ON a.id = x.a_id
  JOIN (SELECT ... FROM a join b ON ...) as foo
  WHERE foo.c = 'bar'
  AND foo.d = true
  AND ...

尽管我想使用spring规范将其转换为java代码。我知道如何在一般情况下使用它们,但我读过,例如,子查询只允许在where部分?是这样吗?
但无论如何:如何在规范中进行sql查询?到目前为止,我使用了一个特殊的规范类,在这个类中我做了如下工作:

public static Specification<Foo> hasStuff(long stuffId) {
        return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get(Foo_.stuff), stuffId);
}

但这在更复杂的情况下是行不通的,对吧?因为如果我和你分手 foo.c = 'bar' 以及 foo.d = true 换成不同的方法,我会做两次连接,对吗?
编辑:哦,对了,还有一件重要的事。如果我想汇总所有的where支票,我该怎么做?以前我只是创建了一个 List<Specification<SomeClass>> 但是由于我现在需要使用连接,我不能把someclass放在泛型中,因为我的结果是任意的。

w9apscun

w9apscun1#

你可以用 nativeQuery = true parameter to the @Query .
如果你不加上 nativeQuery = true 参数 @Query 在spring存储库中,查询将被认为是用jpql编写的。

@Query(
  value = "SELECT stuff
           FROM a
           JOIN x ON a.id = x.a_id
           JOIN (SELECT ... FROM a join b ON ...) as foo
           WHERE foo.c = 'bar'
           AND foo.d = true
           AND ...", 
  nativeQuery = true)
Collection<Entity> findAllRecords();

在jpql中,您可以在这里查看:
子查询可以用在where或having子句中。
所以添加natuvequery属性 true 价值观。它会帮助你的。

相关问题