【问题标题】:Spring JPA Query annotation - input a sql fileSpring JPA Query注解——输入一个sql文件
【发布时间】: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 库。

标签: spring-boot spring-mvc jpa spring-data-jpa jpa-2.0


【解决方案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 中有描述。

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2016-04-11
      • 2019-12-19
      • 1970-01-01
      • 2014-12-24
      相关资源
      最近更新 更多