Ryan Wang
Ryan Wang

Reputation: 51

spring data jpa specification join fetch is not working

I am trying to use Spring Data JPA Specificaiton to query data, but I got some problem here. The Java code is as below:

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

When I comment the code "recipientNoticeJoin.fetch(UserNoticeEntity_.user, JoinType.INNER);", it is working fine, but when I un-comment this, I will get error:

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

So, I am wondering if join fetch is supported by using Specification way, or there is something wrong with my code. I know there is another way by using @Query("some hql"), but somehow I just prefer to use the Specification way. Thanks a lot.

Upvotes: 5

Views: 5311

Answers (1)

djehrame
djehrame

Reputation: 556

The error specifies that you're missing an entity from your select list. Try this:

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

Also, hibernate may run a count query first to determine the number of results, and this can cause the above error. You can avoid this breaking by checking the return type of the query before adding the fetch.

Eager fetching in a Spring Specification

Upvotes: 4

Related Questions