1

我有一段类似于以下的代码:

  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
        }
    }
  }

每次执行 for 循环时,它都会在后台运行额外的休眠查询以提取额外的数据(因为对象被标记为延迟加载)。不需要将这些对象切换到 eager,因为使用 POJO 的其他类不需要该数据。

显然,上面的代码会造成瓶颈,这是我想避免的。是否有一种特定于休眠的方式(即没有本机 SQL)来修改查询以一次性只带回必要的数据?

我可以让查询返回一个 String[][],其中 col1 作为键,col2 作为值,而不是返回 Foo

更新:

我将查询更改为只返回必要的键/值

“从...中选择不同的 c.id、foo.someValue

4

1 回答 1

0

据我了解,您的问题是您不希望默认情况下渴望收集,但在这些具体案例/方法中,在一个查询中获取所有内容?!

这是休眠文档中有关此的片段:

“获取”连接允许使用单个选择来初始化值的关联或集合以及它们的父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外部连接和惰性声明。有关详细信息,请参阅第 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

于 2012-08-24T18:58:43.910 回答