这节我们讲解碰到复杂的查询条件时如何处理,使用CriteriaBuilder理论上可以满足我们任何场景的使用。
1、构造查询条件
注入EntityManager,我们的Repository底层是使用EntityManager来完成实体的增删改查的。


where里面的条件我们可以使用CriteriaBuilder API任意添加组合,逻辑相关的and,or,not,条件的equal,like,between等,还有集合相关的isMember,any等等,理论上所有的场景都考虑到了。
2、分页排序



3、总结
这节基本上都是代码,CriteriaBuilder是一种类型安全的动态查询,我们不需要担心里面会有什么sql注入漏洞什么的,可以放心使用。对于属性,需要注意并不是简单的一个字符串,是一个Path类型的参数,例如root.get("title")。上面介绍了怎么添加复杂的查询条件,怎么排序,怎么分页,怎么统计。
笔者一直强调CriteriaBuilder理论上可以解决所有的使用场景,因为他提供了丰富的API,让人看到例子基本上就知道怎么使用,而且CriteriaBuilder可以让我们能封装一个通用的查询方法出来。但是还是有很多复杂的场景,如果你不知道怎么使用CriteriaBuilder来实现,或者使用CriteriaBuilder效率比较低的话(特别是对象关联关系复杂的时候),我们还可以直接使用sql语句来查询,后面我们会讲到。
代码:
https://github.com/www15119258/springboot-study/tree/branch15
网友评论