Hibernate将非托管实体与托管实体合并

时间:2014-07-16 22:48:24

标签: java mysql performance hibernate

我需要从查询中获取数据,这将检索实体A,实体B和实体C的ID也是树自定义字段。像这样的东西

SELECT
  a.id_entityA,
  b.id_entityB, 
  c.id_entityC, 
  sum(some) * sum(another),
  avg(of_some) * any_factor,
  another_operations,
From ... Many Selects, joins, etc

此检索信息如

54 | 80 | 60 | 5421 | 56474.4 | 4540

在hibernate中,我创建了一个SQLQuery来获取DTO中的信息

public class ExampleDTO {
  private Integer idA;
  private Integer idB;
  private Integer idC;

  private Number fieldX;
  private Number fieldY;
  private Number fieldZ;

  //getters and settters 
}

在查询执行中,我添加了resultTransformer

.setResultTransformer(Transformers.aliasToBean(ExampleDTO.class))

并且工作!!!

但是,我需要实体A,B和C的另一个字段,

public class ExampleDTO {
 // bottom of fields
  private EntityA entityA;
  private EntityB entityB;
  private EntityC entityC;
 // news and olds getters and setters

所以我在一个bucle中读到这个来填补

for(ExampleDTO e : list)
{
   e.setEntityA(entityADao.getById(e.getIdA());
   e.setEntityB(entityBDao.getById(e.getIdB());
   e.setEntityC(entityCDao.getById(e.getIdC());
}

可以使用老式的低性能方式来获取数据。

有一些魔法方法可以在同一个查询中获取三个实体,只需要运行第一个查询并执行 NOT bluce来填充我的dto列表

修改的 假设EntityAEntityBEntityC@Entity

相对应

1 个答案:

答案 0 :(得分:0)

没有神奇的方法来聚合投影和获取实体。无论如何,您必须手动在group by子句中包含所有已获取的实体属性。

如果实体不相关,您最终会得到笛卡尔积,这更麻烦。

我的建议是在查找实体时运行投影查询并获取这些ID并使用二级缓存来优化其他实体检索(但不是通过运行查询,这将绕过二级缓存) :

session.get(EntityA.class, 1L); 
session.get(EntityB.class, 1L);
session.get(EntityC.class, 1L);

如果实体是相关的,您可以尝试使用第二个连接查询来选择一些/所有实体,但这需要让所有这些实体相互引用。