【问题标题】:Spring data jpa, externalizing native queriesSpring data jpa,外部化原生查询
【发布时间】:2019-12-01 12:43:04
【问题描述】:

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

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

现在,由于公司限制,无法将整个查询放在这里,但是查询非常庞大,就像 100 行一样。

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

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

欣赏帮助。

谢谢。

【问题讨论】:

    标签: spring-boot spring-data-jpa


    【解决方案1】:

    您可以将 de 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
    

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

    【讨论】:

      【解决方案2】:

      经过多次努力和尝试,找到了解决办法。

      1) 在项目的资源文件夹中创建 xml 文件(任意名称)。在资源 /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>
      

      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 存储库,并且在该存储库中我们应该有与标签同名的方法。一、E.

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

      }

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

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

      N 然后你可以调用这个方法正常的弹簧方式。

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

      【讨论】:

      • 如果我想使用属性文件,那么这个“spring.jpa.mapping-resources = appQueries.properties”会起作用吗? .我想使用属性文件。
      • 如果我想在查询中传递参数怎么办?
      【解决方案3】:

      在资源下创建 META-INF/jpa-named-queries.properties。在此文件中以这种方式定义您的查询: MyEntity.fetchEntityBySomething=从客户中选择名称

      不过,我没有尝试过原生查询,通常的查询会以这种方式工作。

      不过,请查看:https://github.com/gasparbarancelli/spring-native-query

      【讨论】:

      • 感谢您的快速回复。但这不起作用。我尝试使用相同的名称,还尝试了 jpa-naned-native-query.properies。但是没有用。我需要添加任何其他配置吗?
      • 如果不是原生查询,外部化是否有效?
      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 2020-02-15
      • 2021-02-13
      • 2017-12-13
      • 2018-09-23
      • 1970-01-01
      • 2014-03-29
      • 2021-11-22
      相关资源
      最近更新 更多