没有代码示例很难说reduce如何,但我可以解释这个问题的理论。
每个数据库都有一些在单个查询中返回的列的限制。我已经在使用 SQL Server 和 Hibernate 的遗留应用程序上处理了这个问题。升级 SLQ Server 版本后开始出现此问题。
有一些方法可以解决这个问题。也许遗留应用程序在实体上映射了很多 EAGER 加载,例如:
@ManyToOne
private Person person;
(默认情况下,每个*ToOne 关系都是EAGER)
并且这种关系还有其他EAGER 关系(person 可以急切加载address,address 可以急切加载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 查询上导致此问题,这需要一个巨大的查询。
解释完之后,我会回答你的问题:
- 我是否能够访问后续的表数据,因为它不是通过 Join 与 Join Fetch 返回的?
是的。在事务中,您可以延迟加载信息,例如:
Person person = order.getPerson();
- 有没有办法减少我需要的列(比如我只需要 100 列中的 5 列),而数据仍然映射到休眠对象(我读到它变成了一个列表?)
是的。删除 EAGER,不在 JPQL 查询上使用 FETCH 或 using tuples, DTOs or Object array。