hibernate hql как получить совмещенного ребенка от родителя - PullRequest
2 голосов
/ 23 августа 2011

две таблицы, Кошка и котенок (одна ко многим), в таблице котят 5 записей, и 1 в таблице кошек котенок имеет окрас, 2 в белом и 3 в желтом. Я написал следующий HQL, который возвращает Cat.

select c from Cat c inner join c.kitten k where k.color='yellow'

это верни мне кота. но когда я сделал

cat.getKitten().size() 

он возвращает 5 вместо 3. что я хочу сделать, это только получить подходящего ребенка вместо всех, какой правильный способ сделать это?

кажется, что это делает свое дело, спасибо zzz и все усилия

Session session = sessionFactory.getCurrentSession();
        List<Object> funds = session.createQuery("select k.cat,k from kitten k where k.color='yellow'").list();
        Object[] os = (Object[])funds.get(0);
        Cat c = (Cat)os[0];
        Kitten fc = (Kitten)os[1];
        List list = new ArrayList<Kitten>();
        list.add(fc);
        c.setKittens(list);

это возвращает правильную вещь.

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Короче говоря, вы не хотите выбирать кошку, но хотите выбрать некоторых из ее котят:

select k from Cat c inner join c.kitten k where k.color = 'yellow'

Это выберет 3 котенка, каждый из которых имеет одну и ту же кошку.

0 голосов
/ 23 августа 2011

Запрос запрашивает всех кошек с желтыми котятами, но как только у вас есть кот, вы запрашиваете всех связанных с ним котят (не только желтых).

Возможно, мы сможем помочьбольше, если вы покажете, как вы нанесли на карту / аннотировали классы Cat / Kitten.

0 голосов
/ 23 августа 2011

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

Если присмотреться, hibernate отправляется в БД дважды: один раз с вашим запросом и один раз, чтобы получить коллекцию.

вам нужно сначала получить объект cat, а затем получить отфильтрованных котят, которые будут по умолчанию загружены.

что-то вроде

var kittens= cat.kittens.where(x->x.color="yellow")
var count=kittens.Count();

если ява вы могли бы сделать что-то вроде этого

Collection<Kitten> kittens= cat.getKittens();
Collection<Kitten> filteredKittens = filterCollection(kittens, session);

и ваш метод filterCollection будет:

private static <T> Collection<T> filterCollection(Collection<T> collection, Session s) {
        Query filterQuery = s.createFilter(collection, "where this.color='yellow'");
        return filterQuery.list();
    }

вот блог пост об этом: http://www.flexpasta.com/index.php/2009/05/20/filtering-hibernate-child-collections/

на основе комментариев ниже мы решили использовать

select g, k from grandCat g inner join fetch g.cat c inner join fetch c.kitten k where k.color ='yellow' 

и выберите необходимый контент, а затем приведите его соответствующим образом. Прочитайте комментарии для ясности

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