2009-06-16 2 views
0

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

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

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

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

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

Однако эта попытка с критериями всегда возвращает list.size() нуль (даже если мальчик Гек имеет диапазон змеев с длиной 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(); 

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

Я предполагаю, что проблема с моей попыткой 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>=? 
+1

Да, смотрит прямо на меня:/ – zmf

+0

Ну, у меня было * было * правильно; была ошибка в другом месте. Я проголосовал, чтобы закрыть это. – Glenn

ответ

4

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

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

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

+0

Спасибо, это был отличный ответ. Вы были абсолютно правы, у меня была ошибка в моей конфигурации ассоциации. Ваш фрагмент Criteria также работал (хотя он дал больше дублирующих ответов), и я узнал о параметрах запроса во втором фрагменте. – Glenn

0

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

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

Смежные вопросы