Запрос гибернации для списка объектов, который соответствует идентификаторам списка объектов - PullRequest
1 голос
/ 26 мая 2010

Учитывая классы Foo, Bar, которые имеют отображения спящего режима в таблицы Foo, A, B и C

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

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

Я строю список fooList произвольного размера, и я хотел бы использовать hibernate для получения списка, где результирующий список будет выглядеть примерно так:

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 и получить каждый список и вызвать 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 и делает минимальное количество вызовов базы данных?

Я что-то упустил? Разве гибернация не подходит для этого?

1 Ответ

1 голос
/ 20 июля 2010

Оказывается, что следующее сделало то, что я хотел:

  • Определение компонента Foo в спящем режиме Панель отображения классов со свойствами, необходимыми для выбора элементов
  • Отображение должно связывать сложные типы с идентификаторами через однозначные отображения
  • Заполните список объектов Foo идентификаторами, которые выберут список баров

Список Бар можно получить через

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();

Это дало мне то, что мне было нужно.

SQL, созданный hibernate, оказался не таким ужасным, как я ожидал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...