用于 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 中应该只有一个左连接而没有交叉连接。

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