【问题标题】:Generating dynamic query in spring boot在 Spring Boot 中生成动态查询
【发布时间】:2018-10-11 12:14:27
【问题描述】:

我有一个原生的Mysql 查询

select tl_id,c_name,m_name,u_first_name,t_name, 
tl_logged_at,tl_minutes,tl_description
from users inner join clients on u_id=c_frn_owner_id
inner join matters on m_frn_client_id = c_id
inner join tasks on t_frn_matter_id = m_id
inner join task_logs on tl_frn_task_id = t_id
where c_id =2 and m_id=4 and t_id= 3 and u_id = 4

我可以为此编写 JPQL 而不是本机查询。但是如何使用JPA Specification 获得相同的查询,因为where 条件c_idm_idt_idu_id 中的列或字段是可选的。它们是提供给用户的过滤器选项。

可以使用if 条件生成本机查询。但它们很容易出现拼写错误和SQL Injections

JPASpecification 的文档没有关于连接多个表的信息。

Spring Official JPA Specification Doc

我对@9​​87654334@ 很陌生,所以任何指导都会很有价值。

【问题讨论】:

    标签: mysql spring-boot spring-data spring-data-jpa


    【解决方案1】:

    JPA 2 引入了可用于构建查询的条件 API 以编程方式。

    如果您使用 JPA 2 并且想要创建动态查询,我认为您应该查看 Criteria API 来构建动态查询。或者你可以使用JpaSpecificationExecutor(我还没试过。)检查this相关问题。

    附上一些有用的链接:

    1. JPA Specifications
    2. JPA Criteria Api

    【讨论】:

      【解决方案2】:

      看看 querydsl 项目,我在中型 ERP 中广泛使用它,直到现在都没有让我失望。

      http://www.querydsl.com/static/querydsl/latest/reference/html/

      对于动态where子句:可以使用com.querydsl.core.BooleanBuilder

      因此,当您使用 querydsl 时,您可以首先生成如下所示的 where 子句。

      QEmployee employee = QEmployee.employee;
       BooleanBuilder dynamicWhere = new BooleanBuilder();
       if(true) { //Any condition
           dynamicWhere.and(employee.name.equalsIgnoreCase("someName"));
       }
       if(true){
           dynamicWhere.and(employee.age.gt(18));
       }
      

      然后您可以编写如下查询。

      queryFactory.selectFrom(employee)
          //joins, group by, order by goes here
          .where(dynamicWhere)
          .fetch();
      

      【讨论】:

        猜你喜欢
        • 2016-10-03
        • 2021-12-03
        • 2017-01-03
        • 2019-02-20
        • 1970-01-01
        • 2018-07-06
        • 2018-03-05
        • 2019-02-27
        • 1970-01-01
        相关资源
        最近更新 更多