我试图在我的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
)数据库结构是:

成员可以是项目或黑客马拉松的成员。项目是黑客马拉松的一部分。我在找哈卡顿和儿童项目的所有成员。
QueryDslPredicateExecutor接口对我无效,因为谓词产生了交叉连接:
memberEntity.role.eq(roleSelector).andAnyOf(
memberEntity.hackathonEntity.id.eq(hackathonId),
memberEntity.projectEntity.hackathonEntity.id.eq(hackathonId)
)我试图使用JPAQuery来手动管理连接策略,但也面临着同样的问题:
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_从public.member memberenti0_左侧加入public.project projectent1_ on (memberenti0_.projectid=projectent1_.id),其中和#on 20#?还有(memberenti0_.hackathonid=?还是projectent2_.hackathonid=?)
使用QueryDSL过滤连接实体的正确方法是什么?或者,是否有任何好的替代技术用于查询构建?
发布于 2018-05-15 23:44:14
将查询的andAnyOf部分更改为
.andAnyOf(memberEntity.hackathonEntity.id.eq(hackathonId),
projectEntity.hackathonEntity.id.eq(hackathonId)));在Hibernate中应该只剩下一个连接而没有交叉连接。
编辑:如果这仍然不适用于你,我建议编辑你的问题,包括你如何映射你的实体。
https://stackoverflow.com/questions/50339220
复制相似问题