如何在 Spring Data JPA 中使用 CTE 表达式 WITH 子句

Posted

技术标签:

【中文标题】如何在 Spring Data JPA 中使用 CTE 表达式 WITH 子句【英文标题】:How to use CTE expression WITH clause in Spring Data JPA 【发布时间】:2021-07-13 07:17:05 【问题描述】:

我想在 SQL Server 中编写递归查询。所以我正在使用CTE。查询在 SSMS 中正常工作,但是当我尝试在 JPA 中使用与本机 SQL 相同的 CTE 时,它会出现错误:

名称列 ID 无效。

实体(我在 CTE 中用于递归获取数据)具有 @Id @Column(name="pk_id") private int Id 字段。

我也关注了这个 SOQ:cte sql to simple subset query for JPA

但仍然收到错误,因为名称列 ID 无效。

我以前从未使用过 CTE。如何解决这个问题?

【问题讨论】:

CTE 不适用于 JPQL,您需要改用 SQL。 如何使用递归SQL但是? 只需将SQL放入并将native-query设置为true即可。 是的,我试过了。 @Query(value = "sql here",nativeQuery = true) 并得到同样的错误。但是在native-query 中,我尝试了link 中提到的SQL。可以吗? 问题是,如果您将结果与 JPA 实体匹配,则结果列必须与映射匹配。看起来这在您的结果集中已关闭。 【参考方案1】:

您可以在 JPA 存储库中编写 SQL 查询,因为 @Query 注释也接受本机查询。为此,您需要在 value 参数中指定 SQL 查询,并且 nativeQuery 为 true,如下所示。

您也可以编写 CTE 查询。

public interface ISomeRepository extends JpaRepository<Entity, Long> 


    @Query(value = "SQL QUERY NEED TO BE WRITTEN HERE", nativeQuery = true)
    List<Long> getEntityIds();

【讨论】:

以上是关于如何在 Spring Data JPA 中使用 CTE 表达式 WITH 子句的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring-data-jpa 获取这些数据如何更正确?

处理 JPA 规范和 spring-data-jpa 时如何使用声明 Stream 作为返回类型

如何在 Spring Data JPA 排序中定义空处理?

如何在 Spring Data 中漂亮地更新 JPA 实体?

如何在 Spring Data JPA 中使用带有分页的投影接口?

从控制台应用程序使用带有休眠功能的spring-data-jpa时如何延迟加载收集