Hibernate HQL右外联接

Hibernate HQL右外联接,hibernate,join,hql,Hibernate,Join,Hql,我试图在HQL中执行正确的外部联接。查询创建如下所述: Query query = this.sessionFactory .getCurrentSession() .createQuery( "select O.customer.id as id, O.customer.firstName as firstName, O.customer.lastName as lastName,

我试图在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");
mysql上的SQL查询工作正常,但HQL查询返回内部联接的结果

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查询是:

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

问题在于您编写查询的方式。因为您使用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
如果查看hibernate从查询中生成的SQL,您将看到它正在执行内部联接和Order与Customer之间的右内部联接