EAGER 和分页:Spring MVC + JPA Repository + Hibernate

     2023-02-24     299

关键词:

【中文标题】EAGER 和分页:Spring MVC + JPA Repository + Hibernate【英文标题】:EAGER and Pagination : Spring MVC + JPA Repository + Hibernate 【发布时间】:2017-08-22 18:37:45 【问题描述】:

我有一个 实体 A,它与一个 实体 B (fetch mode = EAGER) 有关系 @OneToMany实体 A 在 LAZY 中也与其他实体有其他关系,但对于这个问题并不重要。

实体 B实体 A 也有关系 @ManyToOne(获取模式 = EAGER)。 实体 BLAZY 中也与其他实体有其他关系,但对于这个问题并不重要。

稍后,我有一个实现 JpaRepository 类的接口,我在其中定义了一个 @Query 与其他实体之间的一些内部连接,以获得具有计算分数的 10 个项目的 Entities A 的集合,使用Page 和 Pageable 元素。

这里这个过程失败了。为什么?

我的数据库中实体 A 的表有 +1000 个具有@query 条件的寄存器。但是在 Hibernate 或 JPA 向我返回 10 个实体 A 之前,在内部,执行 1000 多个选择以获取实体 B 数据(EAGER 实现)和 explote。

为什么不获取 10 个实体 A 并执行 10 个“选择”以仅获取 10 个实体 B?

唯一的解决方案是将我的关系从 EAGER 更改为 LAZY?不能与 EAGER 一起工作?

为什么会这样?有什么解决办法吗?

编辑: 声明:+1000 entityA +1000 entityB(在我的示例中,一个 entityA 只有一个 entityB,但 entityA 可以有多个 entityB)

@Entity
@Table(name="EntityA")
public class EntityA implements Serializable

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID id;

    @OneToMany(mappedBy="entityA", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @OrderBy("updatedDate DESC")
    private Set<EntityB> entitiesB = new HashSet<EntityB>();

    ...


@Entity
@Table(name="EntityB")
public class EntityB implements Serializable

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID id;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "idEntityA", nullable = false)
    private EntityA entityA;

    ...


public interface EntityA_DAO  extends JpaRepository<EntityA, UUID>
    @Query("SELECT DISTINCT a FROM EntityA a INNER JOIN a.entityB b LEFT JOIN b.scoreEntityB s INNER JOIN a.user u INNER JOIN a.properties p INNER JOIN p.category c " +
            "WHERE c.cod IN (:codcats) AND a.user <> :user AND b.codState = '001' AND a.codState NOT IN ('002','004','005') AND p.deleted <> 1 " +
            "GROUP BY b ORDER BY a.createdDate DESC, COUNT(s) DESC")
    public Page<EntityA> findAllByCategories(@Param("user") User user, @Param("codcats") List<Integer> lstCodCats,  Pageable pageable);

编辑 2

这是我的跟踪错误的 sn-pt,重复并重复相同:

在 java.util.HashMap.put(Unknown Source) at java.util.HashSet.add(未知来源)在 java.util.AbstractCollection.addAll(未知来源)在 org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:327) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:234) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:221) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:194) 在 org.hibernate.loader.plan.exec.process.internal.CollectionReferenceInitializerImpl.endLoading(CollectionReferenceInitializerImpl.java:154) 在 org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishLoadingCollections(AbstractRowReader.java:249) 在 org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:212) 在 org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:123) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 在 org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 在 org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3956) 在 org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 在 org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 在 org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 在 org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:116) 在 org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 在 org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) 在 org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:997) 在 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:157) 在 org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:266) 在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68) 在 com.treebuk.model.Fragment_$$_jvsta55_10.hashCode(Fragment_$$_jvsta55_10.java) 在 com.treebuk.model.Fragment.hashCode(Fragment.java:210) 在 sun.reflect.GeneratedMethodAccessor111.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:79) 在 com.treebuk.model.Fragment_$$_jvsta55_10.hashCode(Fragment_$$_jvsta55_10.java) 在 com.treebuk.model.TextFragment.hashCode(TextFragment.java:340) 在 java.util.HashMap.hash(未知来源)在 java.util.HashMap.put(未知来源)在 java.util.HashSet.add(未知来源)在 java.util.AbstractCollection.addAll(未知来源)在 org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:327) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:234) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:221) 在 org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:194) 在 org.hibernate.loader.plan.exec.process.internal.CollectionReferenceInitializerImpl.endLoading(CollectionReferenceInitializerImpl.java:154) 在 org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishLoadingCollections(AbstractRowReader.java:249) 在 org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:212) 在 org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:123) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 在 org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 在 org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3956) 在 org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 在 org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 在 org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 在 org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:116) 在 org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 在 org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) 在 org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:997) 在 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:157) 在 org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:266) 在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68) 在 com.treebuk.model.Fragment_$$_jvsta55_10.hashCode(Fragment_$$_jvsta55_10.java) 在 com.treebuk.model.Fragment.hashCode(Fragment.java:210) 在 sun.reflect.GeneratedMethodAccessor111.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:79) 在 com.treebuk.model.Fragment_$$_jvsta55_10.hashCode(Fragment_$$_jvsta55_10.java) 在 com.treebuk.model.TextFragment.hashCode(TextFragment.java:340) 在 java.util.HashMap.hash(未知来源)

【问题讨论】:

请贴出实现JpaRepository的类的代码(包括相关的查询和方法签名 好的。我编辑了我的帖子。我希望这已经足够了,因为真正的代码很长并且有很多关系和其他实体...... 是的,这就足够了。要解决此问题,请考虑使用 Slice&lt;EntityA&gt;List&lt;EntityA&gt; 作为 findAllByCategories 的返回类型,因为这不会增加创建额外元数据的负担。 (reference) 不起作用。我用 Slice 和 List 进行测试......结果相同......很多 HQL 从entitiesA 中选择。 194 选择和探索!! @Bond-JavaBond 我在其他时间编辑我的帖子以向您展示控制台错误。重复并重复相同的行块,但我看不到错误的起源。有什么想法吗? 【参考方案1】:

最后,我找到了问题所在。问题是实体 B 的方法 hasCode(),该方法与实体 A 进行了比较,然后当 Spring 尝试获取元素时,执行 hascode 方法,并进入无限循环。我更改了 hascode() 和 equal() 方法以删除这些比较(在我的情况下不是必需的)。

【讨论】:

jsp+servlet实现模糊查询和分页效果

---恢复内容开始---1.DAO+MVC包2.DAO接口方法定义packagecom.wanczy.dao;importjava.math.BigDecimal;importjava.util.List;importcom.wanczy.pojo.CustomerResourcePOJO;publicinterfaceCustomerResourceDAO{ /** *&nb 查看详情

用springboot+mysql+jpa实现对数据库的增删改查和分页

使用SpringBoot+Mysql+JPA实现对数据库的增删改查和分页    JPA是JavaPersistenceAPI的简称,中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。  使用Spring... 查看详情

带有 ASP.NET MVC 和 AJAX 的分页表 [关闭]

...述】:我正在寻找在ASP.NETMVC中通过AJAX提供的排序、过滤和分页实现结果分页表的良好模式。在我看来,我应该让我的控制器操作只提供数据而不是标记以保持关注点的分离——因此Ajax回调将提供新的表数据和分页器设置,客户... 查看详情

java示例代码_在Spring MVC 3中实现分页

java示例代码_在Spring MVC 3中实现分页 查看详情

Spring MVC - 分页和请求方法

】SpringMVC-分页和请求方法【英文标题】:SpringMVC-paginationandrequestmethods【发布时间】:2013-11-2311:46:08【问题描述】:假设我有这个控制器:importorg.java.wsg.service.ClientsService;importorg.springframework.beans.factory.annotation.Autowired;importorg.spr 查看详情

GridView 排序和分页

】GridView排序和分页【英文标题】:GridViewsorting&paging【发布时间】:2012-08-2300:06:27【问题描述】:我想在我的页面上显示简单的gridview并为其提供排序和分页功能。单独排序和分页可以正常工作,但两者的组合却不行。例如,... 查看详情

php查询和分页(代码片段)

查看详情

JPA 排序和分页

】JPA排序和分页【英文标题】:JPASortingandPagination【发布时间】:2018-11-0912:17:09【问题描述】:在我的代码中,我需要根据系统的参数化动态挂载选择。为此,我设置了以下结构:StringBuildersql=newStringBuilder();finalStringnumeroCadastro="n... 查看详情

如何在 Spring MVC 3 中实现分页 [关闭]

】如何在SpringMVC3中实现分页[关闭]【英文标题】:HowtoimplementpaginationinSpringMVC3[closed]【发布时间】:2011-01-1517:54:46【问题描述】:是否有任何开箱即用、易于实现的标准分页组件/标签库或代码示例可用于SpringMVC中的分页?【问题... 查看详情

核心数据和分页

】核心数据和分页【英文标题】:coredataandpaging【发布时间】:2010-06-1806:09:14【问题描述】:我有一个包含50,000条记录的数据库。我正在使用核心数据从搜索中获取记录。一次搜索可以轻松返回1000条记录。使用核心数据和uitablevi... 查看详情

Instagram API 和分页

】InstagramAPI和分页【英文标题】:InstagramAPIandPagination【发布时间】:2015-12-0101:13:17【问题描述】:我无法使用InstagramAPI获取所有图片,Pagination的工作方式似乎有所不同,我还无法理解我使用请求:https://api.instagram.com/v1/users/self/... 查看详情

javascript聚合结果计数和分页(代码片段)

查看详情

随机排序和分页 Elasticsearch

】随机排序和分页Elasticsearch【英文标题】:Randomorder&paginationElasticsearch【发布时间】:2012-04-0511:46:45【问题描述】:在thisissue是一种使用可选种子进行排序的功能请求,允许重新生成随机顺序。我需要能够对随机排序的结果... 查看详情

从 \bibliography 中删除参考书目标题和分页符

】从\\\\bibliography中删除参考书目标题和分页符【英文标题】:Removebibliographytitleandpagebreakfrom\\bibliography从\\bibliography中删除参考书目标题和分页符【发布时间】:2014-08-0214:14:45【问题描述】:我想删除标题“参考书目”和使用\\bi... 查看详情

过滤和分页不适用于 ngxpagination 模板

】过滤和分页不适用于ngxpagination模板【英文标题】:Filteringandpaginationisnotworkingwithngxpaginationtemplate【发布时间】:2019-07-1220:10:51【问题描述】:我有一个ngx-pagination的自定义分页模板实现,它可以正常工作。但是,当我尝试使用... 查看详情

linux0.11-分段和分页-09(代码片段)

Linux0.11-分段和分页-09分段和分页参考转载分段和分页书接上回,上回书咱们说到,head.s代码在重新设置了gdt与idt后。来到了这样一段代码。jmpafter_page_tables...after_page_tables:push0push0push0pushL6push_mainjmpsetup_pagingL6:jmpL6那就是开... 查看详情

Jquery 移动搜索和分页

】Jquery移动搜索和分页【英文标题】:Jquerymobilesearchandpagination【发布时间】:2014-10-0511:00:25【问题描述】:我正在为一个Web应用程序使用jQuerymobile,我对带有分页和搜索过滤器的列表有点困惑。在互联网上搜索了几个小时后可... 查看详情

问题:使用 jquery 插件 tablesorter 进行表格排序和分页

】问题:使用jquery插件tablesorter进行表格排序和分页【英文标题】:Problem:tablesortingandpaginationwithjqueryplugintablesorter【发布时间】:2010-06-1015:03:16【问题描述】:我有一个有100行的表,它也有分页。每页显示10条记录。我正在使用jq... 查看详情