如何在 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 实体?