我有一个表A,它有一个属性,该属性是表B中的一个实体,而该实体又连接到表C。
(正在工作的(SQL查询如下所示:
SELECT a.* from A a
LEFT JOIN B b ON a.b_id=b.id
LEFT JOIN C c ON b.c_id=c.id where c.attribute=VALUE;
基本上,VALUE就是我过滤的内容;B和来自B->C.
还有其他参数Im也在过滤,所以我有一个Specification
类,它为每个传入的参数生成Predicate
,以构建谓词列表,然后在最后将其进行AND运算。Specification
是使用类似findAll(MySpecificationClass.search(params))
的东西从我的Repository
调用的。
我很难理解如何在Specification
类中使用CriteriaBuilder
编写此SQL查询。
注意:
- 这是在一个用Kotlin编写的Spring Boot应用程序中
- 我的规范类是一个单例,所以我不能自动连接例如
EntityManager
- 我试图使用
get()
的链来从a导航,通过B导航到C,但这不起作用——它似乎无论如何都会返回所有记录 - 我的项目使用的是spring数据jpa 2.2.6
通过一位同事的帮助,我能够构建这个(也应该是INNER JOIN(。
从我的Specification
类返回的特定谓词是:
val joinToB: Join<A, B> = root.join("B", JoinType.INNER)
val joinToC: Join<B, C> = joinToB.join("C", JoinType.INNER)
cb.equal(joinToC.get<Long>("attribute"), VALUE)