所以我有一个与其他表进行多次连接的查询。返回时出现904错误,因为它返回了太多数据列。我也在使用“加入提取”。
我读到使用“Join”而没有“Fetch”将返回主表而不是所有内容。我的问题是
谢谢!
答案 0 :(得分:1)
List<Object[]>
,其中每个数组包含5个选定的属性。在这种情况下返回实体是没有意义的:返回对象的所有不变量都将被违反,因为几乎所有字段都将为空。答案 1 :(得分:0)
没有代码示例很难说如何精简,但是我可以解释这个问题的理论。
每个数据库对单个查询返回的列都有一定的限制。我已经在使用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 /条件查询中引起此问题,这需要一个庞大的查询。
在解释之后,我将回答您的问题:
- 由于Join和Join Fetch没有返回数据,我将能够访问后续的表数据吗?
是的。在事务内部,您可以延迟加载信息,例如:
Person person = order.getPerson();
- 有没有一种方法可以减少我需要的列(例如,我只需要100个列中的5个),同时数据仍然映射到休眠对象(我读到它成为一个列表?)
是的。删除EAGER,而不在JPQL查询或using tuples, DTOs or Object array上使用FETCH
。