【问题标题】:QueryDSL for SpringData joined entities filtering用于 SpringData 连接实体过滤的 QueryDSL
【发布时间】: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


    【解决方案1】:

    将查询的 andAnyOf 部分更改为

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

    应该让你在 Hibernate 中只有一个左连接,并且没有交叉连接。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      相关资源
      最近更新 更多