我正在学习 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:查询指定连接抓取, 但所获取关联的所有者并不存在于选择中 列表 [SqmListJoin (成员(member1).books(book))]
我找到的所有示例都展示了如何进行联接以过滤结果。例如,Books 与member 结合,根据member.name 获取书籍。但他们只归还书籍,而不是合并连接。
看起来您很接近,但您使用了
.select()
两次,这导致了问题。在 QueryDSL 中,当您使用 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();