【问题标题】:Hibernate merge non-managed entity with managed entityHibernate 将非托管实体与托管实体合并
【发布时间】:2014-07-16 22:48:24
【问题描述】:

我需要从查询中获取数据,这检索实体 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

在休眠中,我创建一个 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

所以我在一个小圆领里读到这个来填补

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 标注

【问题讨论】:

  • 如果我正确理解您要执行的操作,您希望运行一个查询来获取三个实体,并运行 SQL 命令来执行数学运算,所有这些都在一个查询中完成。上次我使用 Hibernate 时,我相信不可能在 HQL 或 Criteria/getById() 中执行任意 SQL 公式;也就是说,您必须选择是运行 SQL,还是让 Hibernate 发挥其 ORM 的魔力,但不能同时做到这两点。但这可能不再准确......

标签: java mysql performance hibernate


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2011-11-18
    • 2013-02-20
    • 2023-03-14
    • 1970-01-01
    • 2015-09-07
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多