我需要从查询中获取数据,这将检索实体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列表
修改的
假设EntityA
,EntityB
和EntityC
与@Entity
答案 0 :(得分:0)
没有神奇的方法来聚合投影和获取实体。无论如何,您必须手动在group by子句中包含所有已获取的实体属性。
如果实体不相关,您最终会得到笛卡尔积,这更麻烦。
我的建议是在查找实体时运行投影查询并获取这些ID并使用二级缓存来优化其他实体检索(但不是通过运行查询,这将绕过二级缓存) :
session.get(EntityA.class, 1L);
session.get(EntityB.class, 1L);
session.get(EntityC.class, 1L);
如果实体是相关的,您可以尝试使用第二个连接查询来选择一些/所有实体,但这需要让所有这些实体相互引用。