提问人:Joseph Larson 提问时间:11/17/2023 最后编辑:Mark RotteveelJoseph Larson 更新时间:11/18/2023 访问量:31
组合联接以返回两个表中的数据
Combined join to return data from two tables
问:
我正在学习 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 的书籍。但他们只返回书籍,而不是合并连接。
答:
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。
评论