2012-08-17 68 views
1

我有类似的代码如下: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从...

+1

如果我理解正确的, “懒加载” 可能是你在找什么。 – jrochette 2012-08-17 14:10:42

+0

首先调整你的sql查询,然后转换成Hibernate查询。几件事情,尽量避免使用“重大”的重复,也尽量减少连接的数量。 – 2012-08-17 14:11:45

+0

但是不会延迟加载本质上运行相同的附加查询?我不确定是否要在POJO上运行急切加载,因为其他代码使用该类,并且不需要这些附加对象。这就是为什么我希望我可以在查询中做到这一点(虽然不是返回一个Foo,我想它会返回一个String [],其中col1是关键字,col2是值) – user973479 2012-08-17 14:13:11

回答

0

据我了解你的问题,你不希望有收集默认渴望但在这些具体案例/方法在一个查询中全部获取?!

这里是Hibernate文档中关于这个片段:

A“取”加入允许值的协会或收藏与使用单个选择它们的父对象一起被初始化。这在收集的情况下特别有用。它有效地覆盖了关联和集合映射文件的外连接和惰性声明。有关更多信息,请参见第19.1节“获取策略”。

from Cat as cat 
    inner join fetch cat.mate 
    left join fetch cat.kittens 

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html