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

问题描述 投票:0回答:4

我使用

spring
CrudRepository
进行数据库连接。

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

但是我怎样才能实现这个目标呢? 我的仓库如下所示:

@Query(value = "<my very long sql query>", nativeQuery = true) //how to inject file content?
@Modifying
@Transactional
public void executeSpecificSql();
java spring spring-data spring-data-jpa
4个回答
17
投票

使用以下步骤。

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

  2. 在给定的属性文件中定义您的查询。 仔细看上面的屏幕截图。这里Group是实体名称,而方法应该与Repository接口中定义的方法匹配。查询应该使用对象名称而不是表名称,而不是列名称,为相应字段提供实体中给出的变量名称.

  3. 带有属性名称的接口方法方法


7
投票
如果您的项目设置有资源文件夹,请在

/META-INF/jpa-named-queries.properties

 文件下创建并添加键值对为 
repoClass.methodName=yoursql
。春季数据将会回升。

对于较长的查询,最好使用带有

xml

 标签的 
CDATA
 属性文件:
https://stackoverflow.com/a/19128259/1194415


2
投票
从 Java 15 开始,您可以将查询存储为单独的类中的

文本块

public class SomeLongQuery { public static final String QUERY = """ SELECT * FROM table WHERE ... ORDER BY some_column; """; }
并将其用作字符串常量:

@Query(value = SomeLongQuery.QUERY, native = true) Iterable<SomeEntity> findByLongQuery();
    

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

1) 使用

<sql-query>

 标签将查询添加到休眠映射文件

<sql-query name="MyQuery">.......

2) 使用

<mapping>

 标签定义包含上述文件的 hibernate 配置文件

<mapping resource="MyQuery.sql.xml"/>

3) 使用指向上述配置文件的属性

"hibernate.ejb.cfgfile"

定义持久性文件

<property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/>

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

EntityManagerFactory



现在,上面的查询就可以在Repository方法中使用了:

@Query(name = "MyQuery", nativeQuery = true) [return type] executeMyQuery();
    
© www.soinside.com 2019 - 2024. All rights reserved.