【问题标题】:Join and Fetch and reducing data returned加入和获取并减少返回的数据
【发布时间】:2017-03-09 23:02:13
【问题描述】:

所以我有一个与其他表进行多次连接的查询。返回时出现 904 错误,因为它返回的数据列太多。我也在使用“Join fetch”。

我读到使用“Join”而不使用“Fetch”将返回主表而不是所有内容。我的问题是

  1. 我是否能够访问后续的表数据,因为它不是通过 Join 和 Join Fetch 返回的?和
  2. 有没有办法减少我需要的列(比如说我只需要 100 列中的 5 列),而数据仍然映射到休眠对象(我读到它变成了一个列表?)。

谢谢!

【问题讨论】:

    标签: hibernate join hql fetch


    【解决方案1】:
    1. 是的,通过延迟加载它们
    2. 是的,但是您会得到一个List<Object[]>,其中每个数组包含5 个选定的属性。在这种情况下返回实体是没有意义的:返回对象的所有不变量都将被违反,因为它们的几乎所有字段都将为空。

    【讨论】:

    • 所以考虑到我不想让每一列都返回导致 904 并且想要保持我的 Hibernate 映射(“默认/空”值在不需要的列上是可以的)的情况下,什么是最好的方法?我还读到我可以在映射文件中的属性上设置延迟加载属性:docs.jboss.org/hibernate/orm/3.5/reference/en-US/html/… on 20.1.8 - 那是另一条路线吗?我正在查询具有 100 多列的表,并不需要全部。谢谢
    • 也来自它提到投影的链接......但这仅在 java 中完成,而不是如果我引入 HQL 对吗?
    • 最好的办法是放弃取回内部具有空值的实体的想法。
    • 那么最好的选择是什么?不在表级别使用 Fetch 进行延迟加载,也许在属性级别使用延迟加载?这会阻止 904 吗?
    【解决方案2】:

    没有代码示例很难说reduce如何,但我可以解释这个问题的理论。

    每个数据库都有一些在单个查询中返回的列的限制。我已经在使用 SQL Server 和 Hibernate 的遗留应用程序上处理了这个问题。升级 SLQ Server 版本后开始出现此问题。

    有一些方法可以解决这个问题。也许遗留应用程序在实体上映射了很多 EAGER 加载,例如:

    @ManyToOne
    private Person person;
    

    (默认情况下,每个*ToOne 关系都是EAGER

    并且这种关系还有其他EAGER 关系(person 可以急切加载addressaddress 可以急切加载street 等)。这种场景通过EAGER加载会带来很多不必要的信息(列)。

    解决方案是识别一些返回大量EAGER 实体的“分支”关系并使用惰性获取“剪切”它:

    @ManyToOne(fetch = FetchType.LAZY)
    private Person person;
    

    在此更改之后,您需要确定这将如何影响您的应用程序,因为人员信息(以及该人员携带的其他可能的 EAGER 实体)不再始终可用。这通常会导致延迟异常,您可以处理在事务中获取信息或使用FETCH 字词进行查询:

    select order FROM Order order JOIN FETCH order.person
    

    如果你在同一个查询中滥用JPQL和FETCH,也会出现列数过多的问题。但通常数据库对这个最大列数非常慷慨,所以这个问题在到处使用 EAGER 的不良实体关系上更为常见。要在使用 FETCH 字词的 JPQL/Criteria 查询上导致此问题,这需要一个巨大的查询。

    解释完之后,我会回答你的问题:

    1. 我是否能够访问后续的表数据,因为它不是通过 Join 与 Join Fetch 返回的?

    是的。在事务中,您可以延迟加载信息,例如:

    Person person = order.getPerson();
    
    1. 有没有办法减少我需要的列(比如我只需要 100 列中的 5 列),而数据仍然映射到休眠对象(我读到它变成了一个列表?)

    是的。删除 EAGER,不在 JPQL 查询上使用 FETCHusing tuples, DTOs or Object array

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 2021-12-19
      • 1970-01-01
      • 2021-11-14
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      相关资源
      最近更新 更多