2009-06-19 5 views
0

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

Проблема заключается в том, что HQL/Критерии Я знаю, заставляет меня только мальчик объекты с полной (неограниченной) Набор змеев, как указано в этих двух примерах (HQL догадка). Я получаю Мальчиков, у которых есть Kites в правильном диапазоне, но для каждого такого Мальчика я получаю всех воздушных змеев, а не только те, что находятся в диапазоне.

select new Boy(name) from Boy b 
     inner join Kite on Boy.id=Kite.boyId 
      where b.name = "Huck" and length >= 1; 

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

Прямо сейчас единственный способ, которым я должен получить правильные наборы длины кайта перебирать список мальчиков и для каждых один повторного запроса змеев для тех, в ассортименте. Я надеюсь, что мастер SQL/HQL/Criteria знает лучший способ. Я бы предпочел получить решение Criteria, потому что у моего реального конструктора «Boy» было довольно много аргументов, и было бы удобно иметь инициализированных мальчиков.

Моя базовая база данных - это MySQL. Не предполагайте, что я много знаю о SQL или Hibernate. Благодаря!

ответ

0

Оказывается, что лучше всего это сделать с помощью реверсирования присоединиться:

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

Обратите внимание, что Змеи в списке в должны быть объединены в мальчик, это можно легко сделать с HashMap.

1

Я не эксперт спящего режима, но, как вы говорите, что вы заинтересованы в решении SQL, а также ...:

В SQL, я предполагаю, что вы имеете в виду что-то вроде (с добавлением индексов, ключей и т.д.):

CREATE TABLE Boys (Id INT, Name VARCHAR(16)) 
CREATE TABLE Kites(Length FLOAT, BoyID INT, Description TEXT) 

плюс, конечно, другие столбцы & С, не имеет.

Все мальчики владеющие 1+ змеев с длинами от 1,0 до 1,5:

SELECT DISTINCT Boys.* 
FROM Boys 
JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5) 

Если вы хотите, чтобы увидеть описание Релевантном Kites', с N строк на мальчика, владеющих N таких змеев:

SELECT Boys.*, Kites.Length, Kites.Description 
FROM Boys 
JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5) 

Надеюсь, кто-то может помочь вам интегрировать их с hybernate ...!

+0

Спасибо, это отлично, и я подумал о правильных строках. – Glenn

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