spring data jpa规范join fetch不起作用

标签 spring join spring-data-jpa fetch jpa-criteria

我正在尝试使用 Spring Data JPA Specificaiton 来查询数据,但我在这里遇到了一些问题。 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;
            });

当我注释代码“recipientNoticeJoin.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 

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

最佳答案

该错误表明您在选择列表中缺少一个实体。试试这个:

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

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

Eager fetching in a Spring Specification

关于spring data jpa规范join fetch不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49507386/

相关文章:

java - 如何在 Spring 中重写请求 URI 和路径变量?

java - 如何在 Spring Security SAML 示例中配置 IDP 元数据和 SP 元数据?

mysql - SQL从一个表中选择两次与单个表相关的字段

mysql - 使用 Spring Data JPA 自定义存储库方法将数据从 csv 加载到 mysql 表

Spring Security AuthenticationFailureHandler 与 AuthenticationFailureEvent

regex - 在文本文件中加入具有特定模式的行

sql - 使用子查询 JOIN varchar 列

java - Spring Data JPA 之间 findBy/findAllBy 的区别

java - 找不到 Spring Boot 2.1 EntityManagerFactory Bean

java - 从 Map 创建对象实例