Spring JPA查询注解--输入一个sql文件。

问题描述 投票:0回答:2

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

类似这样@Query(文件:sqlemployeeList.sql。 , nativeQuery=true)

sqlemployeeList.sql - 我想把这个文件放在代码的某个地方,里面会有select sql。

我不希望有本地 sql 字符串 @Query("select abc......", nativeQuery=true) -- 我不想用这样的方式,因为我的 sql 太大。

spring-boot spring-mvc jpa spring-data-jpa jpa-2.0
2个回答
0
投票

你不能指定一个sql文件,但Spring Data JPA会在下面的文件中查找。/META-INF/jpa-named-queries.properties来查找命名查询,这允许你在 sql 文件中指定查询。

这将在 这个问题的答案.


0
投票

@Jens Schauder是对的,你不能在Spring Data Jpa中指定一个sql文件,但作为一个替代的解决方案,你可以使用这个库。https:/github.comVEINHORNspring-data-sqlfile。 或者你可以直接自行加载文件。请注意:在这个例子中,我使用的是Lombok。 在这个例子中,我使用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;
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.