HQL - внешнее соединение на 2 условиях - PullRequest
0 голосов
/ 14 сентября 2011

Мне нужно написать The Query.Вот упрощенная проблема: есть именованные корзины.В них есть фрукты (0 или больше).Корзина есть у владельцев (1 и более).Фрукты также имеют владельцев (1 или более).Я хочу получить список фруктов Джо в корзинах Джо, включая корзины Джо без фруктов Джо.Здесь мы идем:

select basket.name, fruit.name from Owner owner
join owner.baskets basket
left outer join basket.fruits fruit WITH OWNER in (FRUIT.OWNERS)
where owner.id = joe_id

Но ... Это не работает в HQL.Это только выглядит красиво.Это просто в SQL.

Итак, вопрос в следующем: как я могу объединиться в более чем одно условие в HQL или критерии API (используя Hibernate 3.3).

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

1 Ответ

0 голосов
/ 18 сентября 2011

Я думаю, что вы можете решить свою проблему с помощью API критериев и псевдонимов или подкритериев.

Критерии Hibernate создают псевдонимы с левым внешним соединением для фруктов и внутренним для корзины.

Criteria criteria = getSession().createCriteria(Account.class).setProjection(
            Projections.projectionList()
                    .add(Property.forName("fruit.name"))
                    .add(Property.forName("basket.name"))
    );
    criteria.createAlias("fruits", "fruit",1);
    criteria.createAlias("baskets","basket",0);
    criteria.add(Property.forName("fruit.owner").eqProperty("basket.owner"));
    List<Object> l = criteria.add(Restrictions.eq( "id", some_joe_id_var ).list();
...