Запрос Критерии гибернации с ограниченными ассоциациями - PullRequest
0 голосов
/ 16 июня 2009

Вариант использования здесь, чтобы найти ограниченный набор мальчиков, которые имеют Воздушные змеи с длинами в определенном диапазоне, а затем при желании получить все змеи в этом диапазоне, принадлежащие этим мальчикам.

Не думайте, что я много знаю о SQL или Hibernate.

Я хотел бы сформировать запрос Hibernate Criteria, в котором коллекция была ограничена. Например, скажем, у меня есть класс Boy с двунаправленной ассоциацией один-ко-многим в классе воздушных змеев. Я хочу получить список мальчиков, чьи длины воздушных змеев находятся в диапазоне.

Я могу получить поля (но не для мальчиков), удовлетворяющие этой цели, с помощью HQL-запроса:

select Boy.name from Boy 
       inner join Kite on Boy.id=Kite.boyId 
             where length >= 1;

Однако эта попытка с критериями всегда возвращает list.size () с нулем (даже при том, что у Boy Huck есть диапазон воздушных змеев длиной от 0,1 до 2,0):

Criteria crit = session.createCriteria(Boy.class);
crit.add(Restrictions.eq("name", "Huck"))
    .createCriteria("kites")
    .add(Restrictions.ge("length", new BigDecimal(1.0)));
List list = crit.list();

В идеале и дополнительно, для каждого мальчика в этом списке (при условии, что мой код работал!) Я хотел бы, чтобы все Kites в boy.getKites () удовлетворить ограничение по длине. Эта вторая цель может быть желаемой думаю.

Я думаю, проблема с моей попыткой Criteria заключается в том, что соединение не правильно: я вижу ff., но не знаю, как это исправить.

Hibernate: 
    select
        this_.id as id3_1_,
        this_.name as name3_1_,
        ...
        kites1_.id as id4_0_,
        kites1_.boyId as boyid2_4_0_,
        kites1_.length as length3_4_0_,
        ...
    from
        Boy this_ 
    inner join
        Kite kites1_ 
            on this_.id=kites1_.id         <--- Should be =boyid?
    where
        this_.name=? 
        and kites1_.length>=?

Ответы [ 2 ]

4 голосов
/ 17 июня 2009

Попробуйте изменить на

Criteria crit = session.createCriteria(Boy.class);
crit.add(Restrictions.eq("name", "Huck"))
    .createAlias("kites", "k")
    .add(Restrictions.ge("k.length", new BigDecimal(1.0)));
List list = crit.list();

или напишите явно на HQL:

Query query = HibernateUtil.getSession().createQuery("SELECT b FROM Boy b INNER JOIN b.kites k WHERE b.name=:name AND k.length>=:length");
query.setString("name", "Huck");
query.setBigDecimal("length", BigDecimal.ONE);

Если это не сработает, у вас есть проблема в отображении Boys-Kites (спящий режим, в котором столбец соединения в обеих таблицах равен "id").

0 голосов
/ 19 июня 2009

Спасибо за ответы. На самом деле это был вопрос из двух частей: почему мой запрос Criteria не сработал и как получить ограниченные связанные наборы. Первая часть решается исправлением указанной мной ошибки соединения, и FoxyBOA подтолкнул меня к поиску.

Второй, более интересный вопрос, который я снова задал здесь .

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