Запрос на ограничение связанных объектов - PullRequest
0 голосов
/ 19 июня 2009

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

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

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, потому что мой настоящий конструктор "Boy" имеет довольно много аргументов, и это было бы удобно иметь инициализированных мальчиков.

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

Ответы [ 2 ]

1 голос
/ 19 июня 2009

Я не эксперт по спящему режиму, но, как вы говорите, вы также заинтересованы в решении 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)

Если вы также хотите увидеть описание соответствующих воздушных змеев, с 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 голосов
/ 08 июля 2009

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

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

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

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