0

のような理論上のHQLクエリを実行したとしますFROM Customer。そして、オブジェクトのManyToOneコレクションを返すゲッターがありCustomerます。これにより、Orderへの左結合を持つCustomerから選択するSQLステートメントが実行されます。getOrders()Order

オブジェクトモデルを通じて、プログラムで顧客を反復処理してから、注文を反復処理できます。

ただし、階層オブジェクトモデルを左結合のフラットな表形式の結果に変換して、結果がこのSQLクエリの結果とよく似るようにします。

SELECT *
FROM Customer
LEFT JOIN Order on Customer.customerId = Order.customerId

サンプル結果:

Customer.customerId  ... Order.orderId  Order.customerId ...
1                        200            1
2                        201            2
2                        202            2
3                        NULL           NULL

Hibernateでこれを行う簡単な方法はありますか?

4

3 に答える 3

1

明示的なselect句を使用して制御する「スカラー」レベルで必要なものによって異なります。

select c, o
from Customer c left join c.orders o

(顧客、注文)タプルのリストを返します。または:

select c.id, c.name, o.id, ...
from Customer c left join c.orders o

これにより、アトミックピースのスカラー射影が返されます。

どちらの場合も、リストが返されます。どちらの場合も「動的インスタンス化」を使用できます(ただし、2番目の場合は実際にはより便利です)。

select new CustomerOrderSummary( c.id, c.name, o.id, ... )
from Customer c left join c.orders o

ここで、CustomerOrderSummaryは、コンストラクターが一致する単なるクラスです。

于 2012-10-02T15:31:49.603 に答える
0

結果セットの表現を介してこれを行うことができます。http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/query_native.html

例から:

@SqlResultSetMapping(name="GetNightAndArea", entities={
    @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = {
        @FieldResult(name="id", column="nid"),
        @FieldResult(name="duration", column="night_duration"),
        @FieldResult(name="date", column="night_date"),
        @FieldResult(name="area", column="area_id")
    }),
    @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = {
        @FieldResult(name="id", column="aid"),
        @FieldResult(name="name", column="name")
    })
})
于 2012-10-02T14:58:19.290 に答える
0

Object[]で結果を取得してみることができると思います。例:以下:

    EntityManager entityManager = EntityManager.getEntityManager();
    Query query= entityManager.createQuery("select cust, ord from Customer cust left outer join cust.orders ord where cust.customerId = :customerId");
    tradeQuery.setParameter("customerId", aCustomerId);
    List<Object[]> resultList = (List<Object[]>)query.getResultList();

取得されたresultsListは、フラットのCustomerオブジェクトとOrderオブジェクトを含むオブジェクト配列のリストになります。

    if(!resultList.isEmpty()){
        Iterator<Object[]> iter = resultList.iterator();
        while(iter.hasNext()){
            Object[] resultObj = (Object[])iter.next();
            Customer customer= (Customer )resultObj[0];
            Order order = (Order)resultObj[1];
        }
    }

お役に立てれば!

于 2012-10-02T16:28:13.290 に答える