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

dm7nw8vv  于 2022-10-30  发布在  Spring
关注(0)|答案(4)|浏览(125)

我使用springCrudRepository进行数据库连接。
现在我需要一个相当长(几行)的sql查询,我更愿意将其保存在类路径的文件中,而不是直接保存在代码中。
但我如何才能做到这一点呢?我的回购协议如下所示:

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

gojuced71#

使用以下步骤。
1.在jpa-named-queries.propertysrc/main/resources--〉META-INF文件夹x1c 0d1x中创建www.example.com文件
1.在给定属性文件中定义您查询

请仔细查看上面屏幕截图此处Group是实体名称,而Method应与匹配,方法在存储库接口中定义***查询应具有对象名称而不是表名称,并应提供实体中为各个字段指定变量名称而不是列名
1.具有属性名称的接口方法

bmp9r5qi

bmp9r5qi2#

如果你的项目设置有资源文件夹,在/META-INF/jpa-named-queries.properties文件下创建,并添加键值对repoClass.methodName=yoursql.Spring Data 将被拾取。
对于较长的查询,最好使用带有CDATA标签的xml属性文件:https://stackoverflow.com/a/19128259/1194415

wfypjpf4

wfypjpf43#

不确定它是否适合您的设置,但是,可以通过以下方式实现:
1)使用<sql-query>标记将查询添加到HibernateMap文件

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

2)使用<mapping>标记定义一个包含上述文件的hib配置文件

<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();
aemubtdh

aemubtdh4#

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

public class SomeLongQuery {
    public static final QUERY = 
        """
        SELECT * 
        FROM table
        WHERE
        ...
        ORDER BY some_column;
        """;
}

并将其用作字符串常量:

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

相关问题