当前位置: 首页 > 面试题库 >

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

贺景山
2023-03-14
问题内容

我正在尝试使用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, …);


 类似资料:
  • 我正在尝试使用HQL来获取我的实体以及使用JOIN FETCH的子实体,如果我想要所有的结果,这很好工作,但如果我想要一个页面,情况就不是这样了 我的实体是 因为我有数百万次的访问,所以我需要使用Pageable,并且我希望在单个数据库查询中获取注释,比如: 该HQL调用引发以下异常:

  • 我对hibernate和spring-data-jpa还很陌生。我想做的就是使用分页(大约有4000万条记录)来获取一个实体和它的所有相关实体。也就是说,一个查询来急切地获取根实体和它们的所有映射实体/集合=1个查询 我有2个实体类(Customer和Order)如下: 客户实体 尝试使用batchSize,但由于某种原因它无法工作(同样的N+1问题)。 //@Fetch(FetchMode.Se

  • POM 应用程序 控制器 此外,我有模板文件夹中的资源文件夹和内部错误。html和index.html 当我访问localhost:8080/index时,会显示错误,而不是索引。我做错了什么?这真的是最简单的设置,它已经错了。。。

  • 我在哪里出错了?如果我试图添加可分页对象来查询并运行代码,我将得到以下错误: 无法使用请求的结果类型[java.lang.long]为具有多个返回的查询创建TypedQuery;嵌套异常是java.lang.IllegalArgumentException:无法使用请求的结果类型[java.lang.long]为具有多个返回的查询创建TypedQuery

  • 不明白为什么这个突然停止工作。网站是:http://www.revival.tv/sermons/topical-messages/ 当它进入第二页时,它只使用了归档模板:(不确定为什么这样做,它在去年工作得很好。想知道Wordpress更新是否做到了这一点,我们只是注意到了它。 我使用以下的分页: 然后改写布道:

  • 我试图通过使用Spring Data中的注释,将排序与集成在联接字段上。 有人建议将添加到参数中,以便在某种程度上与分页(spring data jpa@query和pagable)相对应 我已经学习了Baeldung的教程,但这不包括联接 Spring-Data FETCH JOIN与分页不起作用也建议使用,但我更喜欢使用,而不是. 我将在下面留下一些代码示例。如果我遗漏了一些重要的东西,请随时