在spring boot

时间:2018-05-01 12:50:17

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

我有一个原生的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_idt_idu_id中的列或字段是期权。它们是提供给用户的过滤器选项。

可以使用if条件生成本机查询。但他们容易出错和SQL Injections

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

Spring Official JPA Specification Doc

我对JPASpecification很新,所以任何指导都很有价值。

2 个答案:

答案 0 :(得分:0)

  

JPA 2引入了一个可用于构建查询的条件API   编程。

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

附上一些有用的链接:

  1. JPA Specifications
  2. JPA Criteria Api

答案 1 :(得分:0)

看看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();