我有类似的代码如下:Hibernate查询优化
public void doQuery(final Baz baz){
final Query query = getSessionFactory().getCurrentSession().createQuery(
"select distinct foo from Foo as foo "+
"join foo.a as a"+
"join foo.b as b "+
"join b.c as c "+
"where baz=:baz"
);
query.setParameter("baz", baz);
final List<Foo> list = query.list();
for (final Foo foo : list) {
final Set<C> cSet = foo.getB().getCs();
final String value = foo.getSomeValue();
for (final C c : cSet) {
final Long key = c.getSomeLong();
// Do stuff with key and value
}
}
}
每次的循环执行,它将运行额外的Hibernate查询幕后拉额外的数据(因为对象是标记为延迟加载)。不希望将这些对象切换为渴望,因为使用POJO的其他类不需要该数据。
显然上面的代码可能会产生一个我想避免的瓶颈。是否存在修改查询以仅以一次性方式恢复必要数据的特定于hibernate的方式(即没有本机SQL)?
我很好具有查询返回的String [] []与COL1的关键和COL2的价值,而不是返回富
更新:
我改变了查询,只是回报必要
键/值“选择不同的c.id,foo.someValue从...
如果我理解正确的, “懒加载” 可能是你在找什么。 – jrochette 2012-08-17 14:10:42
首先调整你的sql查询,然后转换成Hibernate查询。几件事情,尽量避免使用“重大”的重复,也尽量减少连接的数量。 – 2012-08-17 14:11:45
但是不会延迟加载本质上运行相同的附加查询?我不确定是否要在POJO上运行急切加载,因为其他代码使用该类,并且不需要这些附加对象。这就是为什么我希望我可以在查询中做到这一点(虽然不是返回一个Foo,我想它会返回一个String [],其中col1是关键字,col2是值) – user973479 2012-08-17 14:13:11