Spring Data JPA,外部化本地查询

11

我正在使用Spring Data JPA来执行本地查询,这里是一个例子。

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

现在,由于公司的限制,无法在此处放置整个查询,但查询非常庞大,大约有100行。

我们有许多这样的查询。

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

感谢您的帮助。

谢谢。

4个回答

9
您可以将查询本身的“value”值外部化。 在“src/main/resources”内创建一个名为“META-INF”的文件夹。在其中创建一个名为“jpa-named-queries.properties”的文件。假设您的实体名为“Customer”,表名为“TBL_CUSTOMER”。
当您将查询放置在代码中时,在存储库上,您拥有所编写的代码。您可以通过以下方式将其外部化:
CustomerRepository.java
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long> {

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

}

jpa-named-queries.properties

Customer.findNameNative=\
SELECT C.NAME \
FROM TBL_CUSTOMER C \
WHERE CONDITIONS

名称必须匹配,你必须使用 \ 来进行换行。


7

经过多次尝试,终于找到了解决办法。

1)在项目的资源文件夹中创建XML文件(任意命名),例如将testSQL.xml放置在resources/query文件夹下。

2)遵循'testSQL.xml'中的'orm.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>

3) 在这个XML文件中创建名为"named-native-query"的标签。

<named-native-query name="XyzEntity.methodName">
<query>
<! [CDATA[
Your native query
] ] >
</query>
</named-native-query>

注意 - > 可以添加多个此类本地命名查询标签,所有这些标签都必须位于两个

标签之间。

<entity-mapping> </entity-mapping>

4) 在上一步的名称标签中提到的“XyzEntity”,应该有一个Jpa存储库,在那个存储库中,我们应该有与标签相同名称的方法。即:

public interface XyzRepo extends JpaRepository <XyzEntity, Long> {
Tuple methodName() ; 

5)按如下方式将testSQL.xml添加到应用程序属性文件中

spring.jpa.mapping-resources = query/testSQL.xml

如果您想以正常的spring方式调用此方法,则可以这样做。

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


如果我想使用属性文件,那么这个 "spring.jpa.mapping-resources = appQueries.properties" 是否可行?我想使用属性文件。 - JAVA_CAT
1
如果我想在查询中传递参数怎么办? - user9634982

2
在资源下创建META-INF/jpa-named-queries.properties文件。在此文件中按以下方式定义您的查询: MyEntity.fetchEntityBySomething=select name from Customer 我没有尝试原生查询,但通常的查询可以这样工作。
不过,看看这个:https://github.com/gasparbarancelli/spring-native-query

谢谢您的快速回复。但是这并没有起作用。我尝试使用相同的名称,并尝试了jpa-naned-native-query.properies。但都没有起作用。我需要添加任何其他配置吗? - DarkKnight
如果不是本地查询,外部化是否有效? - fiveelements
请查看此链接:https://github.com/gasparbarancelli/spring-native-query - fiveelements

0

我认为DarkKnight的解决方案是最好的,使用xml设置实体映射可以利用IDE进行高亮和缩进。

但如果你使用spring boot,会有一种优化方法。

这里有一个相关的spring boot属性:spring.jpa.mapping-resources,你可以将实体映射路径设置到此属性中。而且这个属性可以是一个数组,你可以将多个值设置进去。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接