关于hibernate:加入和获取并减少返回的数据

Join and Fetch and reducing data returned

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

我读到使用" Join"而不使用" Fetch"会返回主表,而不是所有内容。我的问题是

  • 我能否访问后续的表数据,因为Join和Join Fetch没有返回该数据?和
  • 有没有一种方法可以减少我需要的列(例如,我只需要100个中的5个),而数据仍然映射到hibernate对象(我读到它成为一个列表?)。
  • 谢谢!


  • 是的,通过延迟加载它们
  • 是的,但是您会得到一个List<Object[]>,其中每个数组都包含5个选定的属性。在这种情况下,返回实体是没有意义的:返回的对象的所有不变式都将受到侵犯,因为几乎所有字段的字段都为null。

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

    每个数据库对单个查询返回的列都有一定的限制。我已经在使用SQL Server和Hibernate的旧版应用程序中解决了此问题。升级SLQ Server版本后,开始出现此问题。

    有一些方法可以解决此问题。也许旧版应用程序在实体上映射了许多EAGER负载,例如:

    1
    2
    @ManyToOne
    private Person person;

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

    并且此关系还有其他EAGER关系(person可以渴望加载addressaddress可以渴望加载street,依此类推)。通过EAGER加载,此方案可能会带来很多不必要的信息(列)。

    解决方案是使用惰性提取来识别一些"分支"关系,该关系返回许多EAGER实体,并对其进行"切割":

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

    在此更改之后,您需要确定这将如何影响您的应用程序,因为人员信息(以及该人员携带的其他可能的EAGER实体)已经不再可用。这通常是由于惰性异常导致的,您可以处理在事务内部获取信息或使用FETCH word:

    进行查询的情况。

    1
    select order FROM Order order JOIN FETCH order.person

    如果您在同一查询上滥用JPQL和FETCH的使用,您还会遇到列过多的问题。但是通常,数据库对于此最大列数非常慷慨,因此在到处都使用EAGER的不良实体关系中,此问题更为常见。要在使用FETCH字的JPQL /条件查询上引起此问题,这需要很大的查询。

    在解释之后,我将回答您的问题:

  • will i be able to access subsequent table data since it is not returned with Join vs Join Fetch?
  • 是的。在事务内部,您可以延迟加载信息,例如:

    1
    Person person = order.getPerson();
  • is there a way to reduce the columns i need (say i only need 5 out of 100) while the data still map to hibernate object (i read it becomes a list?)
  • 是的。删除EAGER,不要在JPQL查询上使用FETCH或使用元组,DTO或对象数组。