Spring JPA Query注解——输入一个sql文件

Posted

技术标签:

【中文标题】Spring JPA Query注解——输入一个sql文件【英文标题】:Spring JPA Query annotation - input a sql file 【发布时间】:2020-09-23 02:36:08 【问题描述】:

我们可以向 Spring JPA 中的 Query 注解传递或输入一个 .sql 文件吗?

类似的东西 @Query(file:/sql/employeeList.sql , nativeQuery=true)

/sql/employeeList.sql - 我想将此文件放在代码中的某个位置,其中将包含 select sql。

我不希望拥有原生 sql 字符串 @Query("select abc....", nativeQuery=true) -- 我不想这样使用。因为我的sql太大了。

【问题讨论】:

这能回答你的问题吗? Get query from file in SPRING BOOT using @Query 似乎他们在上面给出的链接中寻找相同的东西。但 VEINHORN/spring-data-sqlfile 不是 spring 提供的库。我不能在办公项目中使用 github 库。 【参考方案1】:

@Jens Schauder 是对的,您不能在 Spring Data Jpa 中指定 sql 文件,但作为替代解决方案,您可以使用此库 https://github.com/VEINHORN/spring-data-sqlfile,或者您可以简单地自行加载文件。注意:我在这个例子中使用了lombok

@Component
@Slf4j
@AllArgsConstructor
public class ArticleBatchRepository 
  @PersistenceContext
  EntityManager em;

  public List<ArticleBatch> findAll(String articleId) 
  Query nativeQuery =  em.createNativeQuery(loadQuery("/db/queries/articles/BatchByWarehouse.sql"), ArticleBatch.class);
    nativeQuery.setParameter(1, articleId);
    return (List<ArticleBatch>) nativeQuery.getResultList();
  

  private String loadQuery(String path) 
    try 
      InputStream is = this.getClass().getResourceAsStream(path);
      java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
      return s.hasNext() ? s.next() : "";
     catch (Exception e) 
      log.error("Failed to load query : ", path, e.getMessage(), e);
      return null;
    
  

【讨论】:

【参考方案2】:

您不能指定 sql 文件,但 Spring Data JPA 将在 /META-INF/jpa-named-queries.properties 中查找 查找命名查询,它允许您在 sql 文件中指定查询。

这在this answer to a similar question 中有描述。

【讨论】:

以上是关于Spring JPA Query注解——输入一个sql文件的主要内容,如果未能解决你的问题,请参考以下文章

@Query注解的用法(Spring Data JPA)

spring-data-jpa 的@Query注解的使用

Spring Data JPA 常用注解 @Query@NamedQuery

Spring data JPA Checkmarx 漏洞-@Query 注解的资源访问授权不当

spring data jpa @query的用法

jpa query注解 in函数怎么用