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

Spring data jpa规范连接获取不工作

丌官炎彬
2023-03-14

我正在尝试使用Spring数据JPA Specification来查询数据,但这里有一些问题。Java代码如下:

    List<NoticeEntity> studentNoticeEntityList = noticeRepository
            .findAll((root, criteriaQuery, criteriaBuilder) -> {
                criteriaQuery.distinct(true);

                root.fetch(NoticeEntity_.contentEntitySet, JoinType.LEFT);

                Predicate restrictions = criteriaBuilder.conjunction();

                SetJoin<NoticeEntity, UserNoticeEntity> recipientNoticeJoin = root
                        .join(NoticeEntity_.recipientNoticeEntitySet, JoinType.INNER);
                recipientNoticeJoin.on(criteriaBuilder.equal(
                        recipientNoticeJoin.get(UserNoticeEntity_.recipientStatus), NoticeRecipientStatus.Unread));
                Join<UserNoticeEntity, WeChatUserEntity> recipientUserJoin = recipientNoticeJoin
                        .join(UserNoticeEntity_.user);

                restrictions = criteriaBuilder.and(restrictions,
                        criteriaBuilder.equal(recipientUserJoin.get(WeChatUserEntity_.id), id));
                // recipientNoticeJoin.fetch(UserNoticeEntity_.user, JoinType.INNER);

                return restrictions;
            });

当我注释代码“收件人NoticeJoin.fetch(UserNoticeEntity_. user, JoinType. INNER);”时,它工作正常,但当我取消注释时,我会得到错误:

org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 

所以,我想知道使用规范方式是否支持连接获取,或者我的代码有问题。我知道使用@Query(“一些hql”)还有另一种方法,但不知何故我只是更喜欢使用规范方式。非常感谢。

共有1个答案

勾起运
2023-03-14

该错误指定您的选择列表中缺少一个实体。试试这个:

criteriaQuery.multiselect(root, root.get(NoticeEntity_.recipientNoticeEntitySet);

此外,hibernate可能会首先运行计数查询来确定结果的数量,这可能会导致上述错误。您可以通过在添加fetch之前检查查询的返回类型来避免这种中断。

Spring规范中的即时获取

 类似资料:
  • 我将hibernate-orm与spring-data-jpa一起使用。我有三个实体、、声明如下: 我的目标是获得A和获取b的列表,在实体C上有一些条件,而不获取它。以下JPQL工作正常。 当我尝试使用JPA规范时,我的规范如下所示: 我正在重用由fetch操作完成的隐式连接。此连接不符合规范。它输出以下JPQL。 也就是说,没有别名。 我研究了Hibernate GitHub的源代码。我发现,有

  • 问题内容: 我有以下查询和方法 与作为 我希望这个查询可以获取and >关系,但事实并非如此。假设I查询有两个运算符,Hibernate将执行1 + 2 * 2 = 5个查询 我猜这是因为我加入了operator 元素,但他们必须加入自己的行列。 我可以执行同时执行的HQL查询吗? 问题答案: 如果您知道树中只有两个级别,那么您是否考虑过加入更深的一个级别。像下面的东西?

  • 我想使用Spring JPA规范连接函数 这是我的表格代码: > } 我如何在规范中加入表中的学生和家长?

  • 我正在尝试开发一个具有规范和RSQL的搜索API。遵循本教程-https://www.baeldung.com/rest-api-search-language-rsql-fiql

  • 我们有一个媒体对象: } 通道父级的急切获取在常规存储库方法中有效,但在使用规范时无效。 规格如下: 当指定channelType时,“搜索”规范正常工作,因此连接正在工作。如何指定应急切获取连接? 我尝试添加 然后Hibernate抛出一个异常: 组织。冬眠QueryException:查询指定了联接获取,但所获取关联的所有者不在选择列表中[FromElement{explicit,not a

  • 更改历史 2018-02-01 胡小根 初始化文档 1 历史、现状和发展 1.1 历史 1.2 现状 1.3 发展 难点:预测发展方向。 1.4 概念 GraphQL和GraphiQL GraphQL是技术 GraphiQL是浏览器IDE,以使用接口 2 安装和使用 2.1 安装 2.2 使用 2.2.1 试一试 http://graphql.org/swapi-graph