2013-09-11 3 views
2

Я пытаюсь выполнить правое внешнее соединение в HQL. Создание запросов выполняется, как указано ниже:Прямое внешнее соединение HQL

Query query = this.sessionFactory 
      .getCurrentSession() 
      .createQuery(
        "select O.customer.id as id, O.customer.firstName as firstName, O.customer.lastName as lastName, O.customer.address as address, O.customer.city as city, count(O.id) as totalOrders from Order O right outer join O.customer group by O.customer.id"); 

SQL запрос на MySQL работает нормально, но запрос HQL возвращает результат для внутреннего соединения.

SQL запрос:

select c.id, 
    c.firstname, 
    c.lastname, 
    c.city, 
    count(o.id) as total_order 
    from orders o right outer join customers c 
    on c.id = o.customer_id group by id 

ответ

6

Проблема с тем, как вы уже написали запрос. Поскольку вы используете O.customer.XXXX, Hibernate добавляет внутреннее соединение между Order и Customer для запроса, чтобы разрешить O.customer. Вам нужно переписать свой запрос, чтобы использовать результаты правильного внутреннего соединения, введя псевдоним для O.customer в правом внутреннем соединении.

select C.id as id, C.firstName as firstName, C.lastName as lastName, 
    C.address as address, C.city as city, count(O.id) as totalOrders 
from Order O right outer join O.customer C 
group by C.id 

Если бы вы были смотреть на SQL, что Hibernate генерируется из вашего запроса, вы увидите, что она выполняет как внутреннее соединение и правый внутреннее соединение между Порядком и Клиентом.

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