带分页的Spring-Data FETCH JOIN不起作用

我正在尝试使用HQL使用JOIN FETCH来获取我的实体以及子实体,如果我想要所有结果,这可以正常工作,但是如果我想要一个Page,则不是这种情况

我的实体是

@Entity

@Data

public class VisitEntity {

@Id

@Audited

private long id;

.

.

.

@OneToMany(cascade = CascadeType.ALL,)

private List<VisitCommentEntity> comments;

}

并且因为我有数百万的访问,所以我需要使用Pageable,并且我想在单个数据库查询中获取注释:

@Query("SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and ..." )

public Page<VisitEntity> getVenueVisits(@Param("venueId") long venueId,...,

Pageable pageable);

该HQL调用引发以下异常:

Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=com.ro.lib.visit.entity.VisitEntity.comments,tableName=visitdb.visit_comment,tableAlias=comments1_,origin=visitdb.visit visitentit0_,columns={visitentit0_.visit_id ,className=com.ro.lib.visit.entity.VisitCommentEntity}}] [select count(v) FROM com.ro.lib.visit.entity.VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and (v.actualArrival > :date or v.arrival > :date)]

at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374)

at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)

at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:309)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

一旦我删除分页,一切正常

@Query("SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and  ..." )

public List<VisitEntity> getVenueVisits(@Param("venueId") long venueId,...);

显然问题是来自Spring-Data的count查询,但是我们如何解决呢?

回答:

最简单的方法是使用批注的countQuery属性@Query来提供要使用的自定义查询。

@Query(value = "SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments …",

countQuery = "select count(v) from VisitEntity v where …")

List<VisitEntity> getVenueVisits(@Param("venueId") long venueId, …);

以上是 带分页的Spring-Data FETCH JOIN不起作用 的全部内容, 来源链接: utcz.com/qa/418418.html

回到顶部