2

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 クエリは内部結合の結果を返しています。

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
4

1 に答える 1

10

問題は、クエリの書き方にあります。O.customer.XXXX を使用しているため、Hibernate は O.customer を解決するために Order と 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 の間で内部結合と右内部結合の両方が実行されていることがわかります。

于 2013-09-12T02:29:36.920 に答える