gpt4 book ai didi

java - 如何在 Spring Boot 和 Data 中在运行时进行动态查询?

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:59 25 4
gpt4 key购买 nike

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

  • Repository层,用Literal方法命名:FindOneByCity(String city);
  • 通过自定义 repo,使用 @Query 注释:@Query('select * from table where city like ?');

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

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

我正在努力实现的是在不接触代码的情况下创建动态报告的可能性。一个表将包含带有名称的报告记录和带有默认参数(如 begin_date、end_date 等)但具有各种主体的 SQl 查询。示例:

"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 查询的方法。
有了它,您可以根据运行时提供的数据构建动态查询。

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

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


关于您的编辑:

What I am trying to achieve is the possibility to create dynamic reports without touching the code. A table would have records of reports with names and SQl queries with default parameters like begin_date, end_date etc, but with a variety of bodies.

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

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

关于java - 如何在 Spring Boot 和 Data 中在运行时进行动态查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48643239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com