当前位置: 首页 > 知识库问答 >
问题:

SpringData联接实体的QueryDSL筛选

充高扬
2023-03-14

我正在尝试在我的Spring数据服务中使用查询DSL来实现类似于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_ 选择“发布状态”作为publishs2_10_,memberenti0_.角色作为role3_10_来自公共.成员memberenti0_左外侧加入公共项目projectent1_(memberenti0_.项目 id=projectent1_.id)交叉加入公共项目projectent2_其中memberenti0_.投影 id=projectent2_.id 和memberenti0_.role=?和(memberenti0_.哈卡托尼德=? 或projectent2_.哈卡托尼德=?)

使用QueryDSL筛选加入的实体的正确方法是什么?或者有什么好的查询构建替代技术吗?

共有1个答案

越信鸥
2023-03-14

查询的“和任何部分”更改为

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

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

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

 类似资料:
  • 我想知道如何使用JPA标准API通过相关实体的外键过滤实体。 假设我有两个实体如下: 我想查询ID(1,2,3)部门下的员工。

  • 我试图将QueryDSL与Spring Data JPA一起使用。

  • 本文向大家介绍springData使用QueryDsl的示例代码,包括了springData使用QueryDsl的示例代码的使用技巧和注意事项,需要的朋友参考一下 经过多年,spring data jpa越来越完善,在版本迭代的过程中,会不断增加功能,今天看新的reference发现有Querydsl.然后搜索到上面的参考资料2 无论是JpaSpecificationExecutor,还是Quer

  • 我只想检查一下QueryDSL版本3.1.1。-是否仍然不可能与子查询连接,就像这里的答案所写的:JPQL/querydsl:join subquery and get aliased column

  • 我希望为结果提供内容过滤。我的(为简洁起见而编辑)实体如下所示: 节点: 场景: 来源: 下面是我希望实现的筛选器的一个示例。 给定一个SourceTypes集合,我希望选择所有场景,这样每个场景都会被其中一个类型的源引用。我使用QueryDSL和以下谓词实现了这一点: 一系列这些谓词被组合起来给出一个整体查询。即使只选择一个SourceType,结果查询看起来也是这样: 我相信上面发生的是交叉连