mysql在springboot中生成动态查询

irlmq6kh  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(478)

我有个本地人 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_id , m_id , t_id 以及 u_id 是可选的。它们是提供给用户的过滤器选项。
本机查询的生成可以使用 if 条件。但他们很容易打字和 SQL Injections .
文件 JPASpecification 没有与连接多个表相关的信息。
spring官方jpa规范文档
我是新来的 JPASpecification 所以任何指导都是有价值的。

yzckvree

yzckvree1#

jpa2引入了一个criteriaapi,您可以使用它以编程方式构建查询。
如果您使用jpa2并且希望创建动态查询,我认为您应该查看criteriaapi来构建动态查询。或者您可以使用jpaspecificationexecutor(我还没有尝试过)。
附带一些有用的链接:
jpa规范
jpa标准api

zour9fqk

zour9fqk2#

看看querydsl项目,我在一个中型erp中广泛使用它,直到现在都没有失望。
http://www.querydsl.com/static/querydsl/latest/reference/html/
for dynamic 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();

相关问题