我正在尝试在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的成员。项目是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:选择memberenti0_.id为id1_10_,memberenti0_.hackathonid为hackatho4_10_,memberenti0_.userid为userid5_10_,memberenti0_.projectid为projecti6_10_,memberenti0_.publishstatus为publishs2_10_,memberenti0_.role为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 =?和(memberenti0_.hackathonid =?或projectent2_.hackathonid =?)
使用QueryDSL过滤连接实体的正确方法是什么?或者是否有任何好的替代技术用于查询构建?
答案 0 :(得分:0)
将查询的andAnyOf
部分更改为
.andAnyOf(memberEntity.hackathonEntity.id.eq(hackathonId),
projectEntity.hackathonEntity.id.eq(hackathonId)));
只能在Hibernate中为你提供一个左连接和没有交叉连接。
编辑:如果这仍然不适合你,我建议你编辑你的问题以包括你如何映射你的实体。