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

 索马里7_244 发布于 2023-01-29 15:05

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

我的实体是

@Entity
@Data
public class VisitEntity {

    @Id
    @Audited
    private long id;

    .
    .
    .   

    @OneToMany(cascade = CascadeType.ALL,)
    private List comments;
}

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

@Query("SELECT v FROM VisitEntity v LEFT JOIN FETCH v.comments WHERE v.venue.id = :venueId and ..." )
public Page 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 getVenueVisits(@Param("venueId") long venueId,...);

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

2 个回答
  • 最简单的方法是使用注释的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, …);
    

    2023-01-29 15:08 回答
  • 或者,在最新版本的Spring(支持JPA 2.1规范)中,您可以使用实体图,如下所示:

    @EntityGraph(attributePaths = "roles")
    @Query("FROM User user")
    Page<User> findAllWithRoles(Pageable pageable);
    

    当然,命名实体图也可以工作。

    2023-01-29 15:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有