【发布时间】:2018-10-24 15:20:30
【问题描述】:
我正在尝试在我的 Spring Data 服务中使用 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:选择 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 external join public .project projectent1_ on (memberenti0_.projectid=projectent1_.id) 交叉加入 public.project projectent2_ where memberenti0_.projectid=projectent2_.id and memberenti0_.role=?和(memberenti0_.hackathonid=? 或 projectent2_.hackathonid=?)
使用 QueryDSL 过滤连接实体的正确方法是什么?或者有什么好的替代技术来构建查询?
【问题讨论】:
标签: hibernate spring-data jhipster querydsl