【问题标题】:How do Spring (Boot) specifications work when I need joins on multiple occasions?当我需要多次加入时,Spring(Boot)规范如何工作?
【发布时间】:2020-08-21 09:28:06
【问题描述】:

所以我有一个类似的 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 Specifications 将其转换为 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&lt;Specification&lt;SomeClass&gt;&gt;,但由于我现在需要使用连接,所以我不能只将 SomeClass 放在泛型中,因为我的结果将是任意的。

【问题讨论】:

    标签: java spring-boot jpa criteria specifications


    【解决方案1】:

    您可以使用nativeQuery = true parameter to the @Query

    如果您不将nativeQuery = true 参数添加到Spring Repository 中的@Query 注释中,则该查询将被认为是用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 检查here

    子查询可以用在 WHERE 或 HAVING 子句中。

    所以添加带有 true 值的 natuveQuery 属性。它会帮助你。

    【讨论】:

    • 我知道我可以使用@Query,但我没有使用它,因为这是一个动态查询,它取决于 10 种不同的过滤器设置。我会使用@Query,即使没有设置过滤器,我也会进行大量查询。这就是我使用规范的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多