加入并获取并减少返回的数据

时间:2017-03-09 23:02:14

标签: hibernate join hql fetch

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

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

  1. 我能否访问后续的表数据,因为它不会与Join vs Join Fetch一起返回?和
  2. 有没有办法减少我需要的列(比如我只需要100个中的5个),而数据仍然映射到hibernate对象(我把它读成一个列表?)。
  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

每个数据库对单个查询返回的列都有一定的限制。我已经在使用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 /条件查询中引起此问题,这需要一个庞大的查询。

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

  
      
  1. 由于Join和Join Fetch没有返回数据,我将能够访问后续的表数据吗?
  2.   

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

Person person = order.getPerson();
  
      
  1. 有没有一种方法可以减少我需要的列(例如,我只需要100个列中的5个),同时数据仍然映射到休眠对象(我读到它成为一个列表?)
  2.   

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