spring-data-jpa是spring对hibernate框架的封装如果你一开始熟悉的是mybatis,那么转到jpa可能会让你有些不适应jpa的简单查询确实非常非常方便,但是对于复杂查询来说jpa确实有点“复杂”。当然你可以寫原生sql,但是那样就违背了jpa操作对象、避免操作sql的出发点了好,废话不多说进入正题吧。
原先是针对单表的列表查询操作非常简单,所以就用了Specification来做:
//一些查询条件数量比较多 //主要是这段,之前是单表的状态查询
后来改了需求查询逻辑有所改变,涉及到第二张表而我又不想推翻重新写原生sql,那样效率比较低(懒)去百度上疯狂找,奈何没答案也问了很多人,纷纷表示没有用过这样的写法後来我去了spring官网看文档,发现:
官网只有一些简单例子并没有复杂查询的介绍(可能得去看hibernate官网,不过我没去看)
我找了一下CriteriaBuilder的方法,发现存在exists的方法那么,接下来的问题就在于如何构建他的参数Subquery
Subquery看字面意思是子查询,显然sql里面exists后面的查询得放在这里面做
事情有了轉机我发现第二个参数CriteriaQuery有构建子查询的方法
然后我通过这个构建出子查询
//这里是子查询的条件,前者是自身的条件后者是主表的关联條件,当然where方法的参 //数是个可变参数可以根据自己需要加条件 //这句话不加会报错,因为他不知道你子查询要查出什么字段
最后把上面嘚子查询放进exists方法的参数就可以了,
如果是not exists前面再嵌套not方法,下面是示例:
本文没什么深度纯粹经验之谈,希望能帮助到有同样需求嘚你