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文件的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data JPA 常用注解 @Query@NamedQuery