gpt4 book ai didi

Hibernate fetch join -> 无法获取多个包

转载 作者:行者123 更新时间:2023-12-04 14:50:29 25 4
gpt4 key购买 nike

问题是我的实体中有两个包,我想在我的 jsf 前端显示它们(后面是 Spring,所以没有延迟加载)。所以我必须急切地获取它们以在这样的列表中显示信息:

  • 点 1(标签 1、标签 2)(标签 1 ...标签 n)
  • 点 2(标签 3、标签 4)(标签 1 ... 标签 n)

  • 将两个列表都放在热中是行不通的。所以我通过 fetch join 来试试运气。它允许我获取一个列表,但是当我添加第二个列表时,我收到了已知的“无法获取多个袋子”错误。

    Hibernate 可以处理查询中的两个 fetch 连接吗?
    public class PointOfInterest
    @OneToMany(mappedBy="poi")
    private List<PointOfInterestLabel> labels = new ArrayList<PointOfInterestLabel>();

    @ManyToMany
    private List<Tag> tags = new ArrayList<Tag>();

    我的获取加入:
    SELECT DISTINCT p from PointOfInterest p 
    left join fetch p.labels
    left join fetch p.tags WHERE p.figure = :figure

    在启动时,我的 hibernate 工厂的创建失败了:
    Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
    at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94)
    at org.hibernate.loader.hql.QueryLoader.<init>(QueryLoader.java:123)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
    at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:557)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:422)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:883)
    ... 55 more

    最佳答案

    答案是不。它处理不了。这就是它所说的。

    对于值类型(复合元素),它甚至不起作用,因为您没有获得实际属于同一个包项目的信息。

    通常它甚至没有意义。如果您查询一个表并在起始表中获取 10 条记录,第一个包中有 10 条记录,第二个包中有 10 条记录,那么您将检索 1000 条记录,只是为了在内存中创建这 30 个对象。想象一下当每个表中有 100 条记录时的记录数(提示:1,000,000 而不是 300),并且当您获取连接另一个包时(提示:100,000,000 而不是 400)......

    顺便说一句:join fetch 可能会导致奇怪的效果和问题,应该避免,除非您完全知道自己在做什么。

    关于Hibernate fetch join -> 无法获取多个包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7177167/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com