我是Java新手,从Spring Boot和Spring Data JPA开始,所以我知道两种获取数据的方法:

  • Repository层组成,其文字方法命名为:FindOneByCity(String city);
  • 通过自定义存储库
  • ,带有@Query注释:@Query('select * from table where city like?');

  • 两种方式都是静态设计的。

    如何获取在运行时必须构建的查询的数据?

    我想要实现的是,可以在不触摸代码的情况下创建动态报告。一个表将包含带有名称和SQl查询的报告记录,这些报告具有默认参数(例如begin_date,end_date等),但是具有各种正文。例:
    "Sales report by payment method" | select * from sales where met_pay = %pay_method% and date is between %begin_date% and %end_date%;
    

    最佳答案

    Criteria API主要用于此目的。
    它提供了定义JPA查询的另一种方法。
    使用它,您可以根据运行时提供的数据来构建动态查询。

    要使用它,您不仅需要创建一个接口,还需要创建一个自定义存储库实现ant。
    实际上,您确实需要注入EntityManager来创建创建和执行 CriteriaQuery 所需的对象。
    当然,您将必须编写样板代码来构建查询并执行它。

    This section解释了如何使用Spring Boot创建自定义存储库。

    关于您的编辑:

    我试图实现的是创造动态的可能性
    报告而无需触摸代码。一个表将具有以下记录
    名称和带有默认参数的SQl查询的报告,例如
    begin_date,end_date等,但具有各种正文。

    如果查询是直接写在纯文本文件中的,那么Criteria将不是最佳选择,因为JPQL / SQL查询和Criteria查询实际上不是以相同的方式编写的。
    在Java代码中,将更适合将纯文本文件中定义的JPQL / SQL查询映射到Map<String, String>结构。

    但是我对您想做的可行性存有疑问。
    查询可能具有特定的参数,在某些情况下,除了修改代码外,您别无选择。参数的特殊性将使查询的可维护性非常困难且容易出错。就个人而言,我将通过允许客户为每个字段选择是否应该应用条件来满足需求。
    然后从实现方面,我将使用此用户信息来构建CriteriaQuery
    在那里Criteria会做得很好:减少代码重复,提高查询构建的适应性,并在编译类型时进行更多类型检查。

    09-10 02:54
    查看更多