组合联接以返回两个表中的数据

Combined join to return data from two tables

提问人:Joseph Larson 提问时间:11/17/2023 最后编辑:Mark RotteveelJoseph Larson 更新时间:11/18/2023 访问量:31

问:

我正在学习 QueryDSL,有一个基本问题。我正在尝试连接两个表并从两个表中选择数据。

在我的示例中,我有一个 Member 表和 Book 表。Book 有一个外键 memberId 返回 member.id。(可以把它想象成拥有书籍的人。

在 SQL 中,我可能会这样做:

SELECT member.name, book.title FROM member, book WHERE book.member_id = member.id;

我正在尝试从QueryDSL做同样的事情。这是我的代码,这显然是错误的:

List<Tuple> results = queryFactory
        .selectFrom(member)
        .innerJoin(member.books, book)
        .select(member.id, member.name, book.name)
        .fetchJoin()
        .fetch();

我收到此错误:

org.hibernate.query.SemanticException: 查询指定的联接获取, 但是 Fetched 关联的所有者不在 Select 中 列表 [SqmListJoin (Member(member1).books(book))]

我找到的所有示例都显示了如何进行联接以过滤结果。例如,Books 与 member 联接以获取基于 member.name 的书籍。但他们只返回书籍,而不是合并连接。

Java 查询DSL

评论


答:

1赞 Georgii Lvov 11/17/2023 #1

看起来你已经很接近了,但你使用了两次,这导致了问题。在 QueryDSL 中,当您使用 时,它期望提取的关联的所有者出现在选择列表中。以下是尝试解决此问题的方法:.select()fetchJoin()

List<Tuple> results = queryFactory
        .select(member.id, member.name, book.title) // Include book.title in the select list
        .from(member)
        .innerJoin(member.books, book)
        .fetchJoin()
        .fetch();

评论

1赞 Joseph Larson 11/18/2023
你让我离得很近。我为其他人发布了最终答案。我不得不稍微调整一下子句并添加一个子句,但是,但你越过了驼峰。谢谢。innerJoin()on()
1赞 Joseph Larson 11/18/2023 #2

在 Georgia Lvov 的帮助下,我用这段代码到达了那里:

    List<Tuple> results = queryFactory
            .select(member.id, member.name, book.title)
            .from(member)
            .innerJoin(book)
            .on(book.in(member.books))
            .fetchJoin()
            .fetch();

他让我走近了。该条款不同,我添加了该条款。innerJoin()on()

我不确定我的条款是否是最佳的——可能有更好的方法可以做到这一点。on()

但它有效。谢谢,Georgii。