我有一个原生的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 Official JPA Specification Doc
我对JPASpecification
很新,所以任何指导都很有价值。
答案 0 :(得分:0)
JPA 2引入了一个可用于构建查询的条件API 编程。
如果您使用JPA 2并且想要创建动态查询,我认为您应该查看Criteria API来构建动态查询。或者您可以使用JpaSpecificationExecutor(我还没有尝试过。)检查this相关问题。
附上一些有用的链接:
答案 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();