用于 SpringData 加入实体过滤的 QueryDSL
QueryDSL for SpringData joined entities filtering
我正在尝试在我的 Spring 数据服务中使用 QueryDSL 来实现类似于 SQL
的查询
SELECT member.*
FROM member
LEFT JOIN project on member.projectid = project.id
WHERE
member.role = 'EXPERT' AND (
project.hackathonid = :hackathonId OR
member.hackathonid = :hackathonId
)
数据库结构是:
成员可以是 Project 或 Hackathon 的成员。项目是黑客马拉松的一部分。我正在尝试查找 Hachaton 和子项目的所有成员。
QueryDslPredicateExecutor 接口对我不起作用,因为 Predicate 产生了交叉连接:
memberEntity.role.eq(roleSelector).andAnyOf(
memberEntity.hackathonEntity.id.eq(hackathonId),
memberEntity.projectEntity.hackathonEntity.id.eq(hackathonId)
)
我尝试使用 JPAQuery 来手动管理 JOIN 策略,但也遇到了同样的问题:
query.from(memberEntity)
.leftJoin(projectEntity).on(memberEntity.projectEntity.id.eq(projectEntity.id))
.where(
memberEntity.role.eq(roleSelector).andAnyOf(
memberEntity.hackathonEntity.id.eq(hackathonId),
memberEntity.projectEntity.hackathonEntity.id.eq(hackathonId)
)
)
Hibernate: select memberenti0_.id as id1_10_, memberenti0_.hackathonid as hackatho4_10_, memberenti0_.userid as userid5_10_, memberenti0_.projectid as projecti6_10_, memberenti0_.publishstatus as publishs2_10_, memberenti0_.role as role3_10_ from public.member memberenti0_ left outer join public.project projectent1_ on (memberenti0_.projectid=projectent1_.id) cross join public.project projectent2_ where memberenti0_.projectid=projectent2_.id and memberenti0_.role=? and (memberenti0_.hackathonid=? or projectent2_.hackathonid=?)
使用 QueryDSL 过滤连接实体的正确方法是什么?或者有什么好的查询构建替代技术吗?
将查询的 andAnyOf
部分更改为
.andAnyOf(memberEntity.hackathonEntity.id.eq(hackathonId),
projectEntity.hackathonEntity.id.eq(hackathonId)));
在 Hibernate 中应该只有一个左连接而没有交叉连接。
编辑:如果这仍然不适合您,我建议您编辑您的问题以包括您如何映射您的实体。
我正在尝试在我的 Spring 数据服务中使用 QueryDSL 来实现类似于 SQL
的查询SELECT member.*
FROM member
LEFT JOIN project on member.projectid = project.id
WHERE
member.role = 'EXPERT' AND (
project.hackathonid = :hackathonId OR
member.hackathonid = :hackathonId
)
数据库结构是:
成员可以是 Project 或 Hackathon 的成员。项目是黑客马拉松的一部分。我正在尝试查找 Hachaton 和子项目的所有成员。
QueryDslPredicateExecutor 接口对我不起作用,因为 Predicate 产生了交叉连接:
memberEntity.role.eq(roleSelector).andAnyOf(
memberEntity.hackathonEntity.id.eq(hackathonId),
memberEntity.projectEntity.hackathonEntity.id.eq(hackathonId)
)
我尝试使用 JPAQuery 来手动管理 JOIN 策略,但也遇到了同样的问题:
query.from(memberEntity)
.leftJoin(projectEntity).on(memberEntity.projectEntity.id.eq(projectEntity.id))
.where(
memberEntity.role.eq(roleSelector).andAnyOf(
memberEntity.hackathonEntity.id.eq(hackathonId),
memberEntity.projectEntity.hackathonEntity.id.eq(hackathonId)
)
)
Hibernate: select memberenti0_.id as id1_10_, memberenti0_.hackathonid as hackatho4_10_, memberenti0_.userid as userid5_10_, memberenti0_.projectid as projecti6_10_, memberenti0_.publishstatus as publishs2_10_, memberenti0_.role as role3_10_ from public.member memberenti0_ left outer join public.project projectent1_ on (memberenti0_.projectid=projectent1_.id) cross join public.project projectent2_ where memberenti0_.projectid=projectent2_.id and memberenti0_.role=? and (memberenti0_.hackathonid=? or projectent2_.hackathonid=?)
使用 QueryDSL 过滤连接实体的正确方法是什么?或者有什么好的查询构建替代技术吗?
将查询的 andAnyOf
部分更改为
.andAnyOf(memberEntity.hackathonEntity.id.eq(hackathonId),
projectEntity.hackathonEntity.id.eq(hackathonId)));
在 Hibernate 中应该只有一个左连接而没有交叉连接。
编辑:如果这仍然不适合您,我建议您编辑您的问题以包括您如何映射您的实体。