繁体   English   中英

当查询存储为外部文件时,如何在 Spring boot Repository 中为本机查询填充 @Query 值

[英]How to populate @Query value for native queries in Spring boot Repository when Queries are stored as external files

类似的问题已于 2015 年在这里提出并回答。

但是,我不想将查询存储在 XML 文件中,而是希望将它们存储在外部 .sql 文件中并从那里读取查询。 为了在我们的 Spring Boot 应用程序 - 2.1.5.RELEASE with Java 8 中实现这一点,我们将查询存储在资源文件夹中,如下所示

src/main/resources - queries - A.sql - B.sql

要阅读上述查询,我​​正在 QueryReader 类中阅读它们,如下所示

@Component
public class QueryReader {

    public String getQueryFromFile(String fileName) {
        System.out.println("getQueryFromFile() : " + fileName);
        return this.convertInputStreamToString(this.getTemplateAsStream(fileName));
    }




     private InputStream getTemplateAsStream(String queryFileName){
            ClassLoader classLoader = getClass().getClassLoader();
            InputStream iStream =classLoader.getResourceAsStream("queries/" + queryFileName);

            return iStream;
        }
}

并在代码中的任何地方使用它,我在类下面,这样我就可以调用它的方法

@Component
public class MyQueries {


    @Autowired
    private QueryReader qfr;

    public String queryErroredRecords() {
        return qfr.getQueryFromFile("A.sql");
    }

将它与 JDBCTemplate 一起使用时,这按预期工作,但是当我尝试从 Repository 的 @Query 注释中使用此方法时,我无法使用以下错误。

存储库代码

@Repository
public interface AdminRepository extends JpaRepository<OrderBackupRecordEO, BigDecimal>{

    @Autowired
    public MyQueries queries;


@Query(value = queries.queryErroredRecords() , nativeQuery= true)
    List<String> findX();
}

上面的存储库给出了如下错误:

1.注解属性Query.value的值必须是常量表达式(对于@Query注解)

2.空白的final字段查询可能没有初始化(对于@Autowired注解)

我怎样才能让它工作?

我只想添加一个可能对您有帮助的注释。

您的解决方案不能仅仅因为在接口中的 java 中所有字段(变量)默认为publicstaticfinal ,这就是为什么您不能@Autowire接口内的任何依赖项的原因。

这就是为什么它适用于您的 JDBCTemplate (这是一个类)的情况,而不适用于 spring 数据存储库(这是一个接口)。

Spring 已经有一个“开箱即用”的解决方案,您不需要进行所有这些操作。

@Repository
public interface AdminRepository extends JpaRepository<OrderBackupRecordEO, BigDecimal> {

    List<String> findX();
}

文件src/main/resources/META-INF/jpa-named-queries.properties

OrderBackupRecordEO.findX=\
    SELECT record FROM OrderBackupRecordEO record WHERE ...

就这样! 没有任何加载、操作、手动处理——一个实现隐藏在 Spring 中——非常简单和可靠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM