2010-05-26 101 views
0

给定一个类Foo,Bar有hibernate映射到表Foo,A,B和CHibernate查询匹配对象ID的对象列表

public class Foo { 
    Integer aid; 
    Integer bid; 
    Integer cid; 
    ...; 
} 

public class Bar { 
    A a; 
    B b; 
    C c; 
    ...; 
} 

我构建了一个任意大小的List fooList,我想用hibernate来获取List里面的结果列表将看起来像这样:

Bar[1] = [X1,Y2,ZA,...] 
Bar[2] = [X1,Y2,ZB,...] 
Bar[3] = [X1,Y2,ZC,...] 
Bar[4] = [X1,Y3,ZD,...] 
Bar[5] = [X2,Y4,ZE,...] 
Bar[6] = [X2,Y4,ZF,...] 
Bar[7] = [X2,Y5,ZG,...] 
Bar[8] = ... 

其中每个Xi,Yi和Zi代表一个独特的对象。

我知道我可以迭代fooList并获取每个List并调用barList.addAll(...)来构建结果列表,如下所示:

List<bar> barList.addAll(s.createQuery("from Bar bar where bar.aid = :aid and ... ") 
    .setEntity("aid", foo.getAid()) 
    .setEntity("bid", foo.getBid()) 
    .setEntity("cid", foo.getCid()) 
    .list(); 
    ); 

有没有更简单的方法,理想情况下是一个更好地利用hibernate并进行最少量的数据库调用?

我错过了什么吗?休眠不适合这个吗?

+0

FOO和BAR是否将FK和FH分开的表格都映射到映射A,B,C等的表格上? FOO和BAR之间的自然关系是什么?将FK列映射为整数而不是其映射对象的动机是什么?这是一个非Hibernate的事情。 一个假设通过更好地使用休眠你的意思是,能够通过一个对象关系访问这个列表? – Affe 2010-05-26 16:42:50

+0

Foo是一个主表,Bar是一个细节表。 A,B,C都与主和细节都有FK关系。它们是之前项目正常化的结果。我可以将Ids切换为正确的对象关系。 – sal 2010-05-26 19:38:18

回答

1

原来,以下做了什么,我想:

  • 在需要选择的项目
  • 映射应该链接复杂类型的属性休眠 类映射酒吧定义组件的Foo通过一到一个映射的id
  • 填充富的列表,IDS将选择酒吧

栏的列表的列表可以是对象通过

List<Foo> lf = this.getTheListOfFooWithIds(...); 
Query qb = session.createQuery("from Bar b where b.foo in (:foo)"); 
qb.setParameterList("foo", lf); 
List l = qb.list(); 

这让我得到了我所需要的东西。

由hibernate创建的SQL并不像我期望的那么糟糕。