SpringData的QueryDSL加入了实体过滤

时间:2018-05-14 21:24:06

标签: hibernate spring-data jhipster querydsl

我正在尝试在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
)

数据库结构是: enter image description here

会员可以是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过滤连接实体的正确方法是什么?或者是否有任何好的替代技术用于查询构建?

1 个答案:

答案 0 :(得分:0)

将查询的andAnyOf部分更改为

.andAnyOf(memberEntity.hackathonEntity.id.eq(hackathonId), 
    projectEntity.hackathonEntity.id.eq(hackathonId)));

只能在Hibernate中为你提供一个左连接和没有交叉连接。

编辑:如果这仍然不适合你,我建议你编辑你的问题以包括你如何映射你的实体。