Spring data jpa,外化原生查询

Dar*_*ght 9 spring-data-jpa spring-boot

我正在使用 Spring data jpa 来执行本机查询,这是示例。

@Query(value = "select name from customer", nativeQuery = true) 
public List<String> findNameNative() ;
Run Code Online (Sandbox Code Playgroud)

现在,由于公司限制不能把整个查询放在这里,但查询非常庞大,比如 100 行。

N 我们有很多这样的查询。

有没有一种方法可以在单独的文件(如 xml 或属性文件)中定义查询并在此处引用它们。(保持代码干净)

得到帮助。

谢谢。

Ale*_*pos 9

您可以外部化 de value,它是查询本身。在其中src/main/resources,创建一个名为 的文件夹META-INF。在其中创建一个名为jpa-named-queries.properties.

假设您的实体被称为Customer并且表是TBL_CUSTOMER。

当您将查询保留在代码中时,在您的存储库中,您就拥有了您编写的代码。你可以这样外部化它:

客户存储库.java

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long> {

    @Query(nativeQuery = true) 
    public List<String> findNameNative();

}
Run Code Online (Sandbox Code Playgroud)

jpa 命名查询.properties

Customer.findNameNative=\
SELECT C.NAME \
FROM TBL_CUSTOMER C \
WHERE CONDITIONS
Run Code Online (Sandbox Code Playgroud)

名称必须匹配,并且必须使用 \ 作为换行符。


Dar*_*ght 7

经过多次努力和尝试找到了解决方案。

1) 在项目的资源文件夹中创建 xml 文件(任意名称)。在 resources /query 中说 testSQL.xml

2)遵循testSQL.xml中'orm.xml'的xml标准,复制粘贴标题并创建标签,

<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<named-native-query>
</named-native-query>
</entity-mapping>
Run Code Online (Sandbox Code Playgroud)

3)在此xml中创建带有named-native-query标签的标签。

<named-native-query name="XyzEntity.methodName">
<query>
<! [CDATA[
Your native query
] ] >
</query>
</named-native-query>
Run Code Online (Sandbox Code Playgroud)

注意 -> 可以添加多个此类本机命名查询标签,并且所有标签都必须位于

<entity-mapping> </entity-mapping>
Run Code Online (Sandbox Code Playgroud)

4) 上面步骤中名称标签中提到的“XyzEntity”应该有一个 Jpa 存储库,并且在该存储库中我们应该有与标签同名的方法。IE

public interface XyzRepo extends JpaRepository <XyzEntity, Long> {
Tuple methodName() ; 
Run Code Online (Sandbox Code Playgroud)

}

5)在应用程序属性文件中添加testSQL.xml,如下所示

spring.jpa.mapping-resources = query/testSQL.xml
Run Code Online (Sandbox Code Playgroud)

N 然后你就可以正常调用这个方法了 spring 方式。

如果有人被困在这个问题上并需要详细的解决方案,请告诉我。