我正在学习QueryDSL,我有一个基本的问题.我正在try 连接两个表,并从两个表中 Select 数据.

在我的示例中,我有一个Members表和Book表.Book有一个外键MemberID,该外键MemberID返回给Member.id.(把它想象成拥有书籍的人.)

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

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

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

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

我得到了这个错误:

Org.hibernate.query.SemancException:查询指定JOIN取数, 但获取的关联的所有者不在SELECT中 List[SqmListJoin(Member1).book(Book))]

我找到的所有示例都显示了如何进行连接以过滤结果.例如,Books与Members结合在一起,根据Member.name获得图书.但他们只归还书籍,而不是联合起来.

推荐答案

看起来您已经很接近了,但是您使用了两次.select(),这是导致问题的原因.在QueryDSL中,当您使用fetchJoin()时,它期望获取的关联的所有者出现在 Select 列表中.以下是您可以try 解决该问题的方法:

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();

Java相关问答推荐

当切换javaFX场景时,stage的大小正在Minimize

Junit with Mockito for java

为什么在枚举中分支预测比函数调用快?

连接Quarkus中的两个异步操作

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

如何让DTO接受空字符串字段,但如果它们不为空,则应用JPA验证?

如何获取Instant#of EpochSecond(?)的最大值

在Eclipse中数组的可空性

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

Java连接池无法正常工作

在向WebSphere中的文档添加元素时iText挂起

如何仅使用键/ID的一部分(组合)高效地返回映射值?

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

Groovy/Java:匹配带引号的命令选项

Java泛型类方法的静态返回类型是否被类型擦除?

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

由于可为null,无法在kotlin中实现java接口

在外部类和内部类之间,当调用外部类内部或外部的主方法时,它们的静态初始化程序的运行顺序不同

从 Java 17 切换回 Java 8 后出现的问题

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?