2009-08-27 2 views
2

Я пытаюсь написать запрос в HQL, и у меня проблемы с ним. Это, вероятно, не слишком сложно, но я довольно ужасен на языках запросов в целом и в HQL.HQL 1 to many count() question

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

public class Owner { 
long ownerId; 
List<Pet> pets; 
} 
public class Pet { 
Owner myOwner; 
List<Toy> toys; 
} 
public class Toy { 
    Pet petThatOwnsThisToy; 
    boolean isSqueaky; 
} 

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

Я также был бы рад узнать любые полезные учебники по HQL за пределами документации (что отлично, если предположить, что один из них уже является профилем SQL, которого я не знаю).

+0

+1 за великое имя ;-) – KLE

ответ

1

А что?

select count(pet) 
from Pet pet 
join pet.myOwner owner 
where owner.id = :ownerId 
and pet.id in (
    select pet.id 
    from Toys toy 
    join toy.petThatOwnsThisToy pet 
    group by pet.id 
    having count(pet.id) >= 3 
) 

Должен признаться, что я не пробовал, я быстро это сделал.

1

Более объектно-ориентированный путь (не уверен, что производительность, хотя):

select count(pet) 
from Pet pet 
where pet.owner.id = :ownerId 
and size(pet.toys) >= 3