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



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

无效的名称列Id。

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

我还遵循了这个SOQ:cte-sql到JP的简单子集查询

但仍出现错误,因为名称列Id无效。

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

您可以在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();
}

如果您使用递归查询,创建视图可能是在JPA 中使用它的一种方式

例如,创建如下视图:

CREATE VIEW RECUSRSIVE_QUERY_VIEW
AS
[Your Recursive CTE]

然后编写一个实体类映射到RECUSRSIVE_QUERY_VIEW:

@Entity
@Table(name="RECUSRSIVE_QUERY_VIEW")
public class RecursiveQueryView {
//Declare column and getter/setter
}

然后你应该能够使用JpaRepository与这个实体:

interface RecursiveQueryViewJpaRepository extends JpaRepository<RecursiveQueryView,String> {
}

希望这能帮助

最新更新