如何将 @Query sql 存储在 CrudRepository 的外部文件中?

How to store @Query sql in external file for CrudRepository?

我正在使用 springCrudRepository 进行数据库连接。

现在我需要一个相当长的(几行)sql 查询,我更愿意将其保存在类路径中的文件中,而不是直接在代码中。

但是我怎样才能做到这一点呢? 我的回购看起来如下:

@Query(value = "<my very long sql query>", nativeQuery = true) //how to inject file content?
@Modifying
@Transactional
public void executeSpecificSql();

不确定它是否适合您的设置,但是,这可以通过以下方式完成:

1) 使用 <sql-query> 标签

将查询添加到休眠映射文件
<sql-query name="MyQuery">.......

2) 使用 <mapping> 标签

定义包含上述文件的休眠配置文件
<mapping resource="MyQuery.sql.xml"/>

3) 使用 属性 "hibernate.ejb.cfgfile" 指向上述配置文件

定义持久性文件
<property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/>

4) 使用上面的 属性 文件构建 EntityManagerFactory

现在,上面的Query可以用在Repository方法中了:

@Query(name = "MyQuery", nativeQuery = true)
[return type] executeMyQuery();

如果您的项目设置有资源文件夹,请在 /META-INF/jpa-named-queries.properties 文件下创建并添加键值对作为 repoClass.methodName=yoursql。 Spring 数据会恢复。

对于较长的查询,最好使用带有 CDATA 标签的 xml 属性文件:

使用以下步骤。

  1. 在 src/main/resources-->META-INF 文件夹中创建 jpa-named-queries.property 文件

  2. 在给定的属性文件中破坏您的查询。 上图看 closely.Here Group 是 Entity name,而 Method 应该匹配 和 Repository 接口中定义的 method。 查询应该有对象名称而不是 table 名称,而不是列名称提供实体中为相应字段提供的变量名称。

  3. 名称为属性的接口方法方法