1

私は3つのテーブルを持っています。Order, Location,Order_Locationここで、は対多の関係Order_Locationを保持するテーブルです。

Order持っていList<Location>ます。Locationというプロパティがありますcity。HQL (Java 用の Hibernate 3.6) を使用して、特定の注文のすべての場所を取得したいと考えていcityます。

hbm ファイルでは、 idbagList<Location>を使用してマップされます。HQL を取得しましたが、生成された SQL クエリは、テーブルに 2 回結合しているため、オーバーヘッドが生じていると感じています。LocationOrder_Location

ここで何が間違っていますか?

SELECT o.locationList FROM Order o
join o.locationList locList  
where o.orderId = 1
order by locList.city desc

これは以下のようなものに変換されます

select
  order4_.LOC_ID as order1_355_,
  order4_.LOC_CODE as order2_355_,
  order4_.CITY as order3_355_,
  order4_.CITY_LONG_NAME as order4_355_ 
from
   sche.order order0_ 
   inner join
   sche.order_location order1_ 
   on order0_.ORDER_ID=order1_.ORDER_ID 
   inner join
   sche.location order2_ 
   on order1_.LOC_ID=order2_.LOC_ID 
   inner join
   sche.order_location order3_ 
   on order0_.ORDER_ID=order3_.ORDER_ID 
   inner join
   sche.location order4_ 
   on order3_.LOC_ID=order4_.LOC_ID 
 where
   order0_.ORDER_ID=1 
 order by
   order2_.city desc

=========編集

Order.hbm.xml

  <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"  

 >
<hibernate-mapping>
    <class name="collectionorderby.Order" table="ORDER">
        <id name="orderId" type="string">
            <column name="ORDER_ID" length="32" />
            <generator class="uuid" />
        </id>

        <idbag name="locationList" lazy="false" table="ORDER_LOCATION" fetch="select">
            <collection-id column="ORDER_LOCATION_ID" type="string">
                <generator class="uuid" />
            </collection-id>
            <key>
                <column name="ORDER_ID" length="32" not-null="true" />
            </key>
            <many-to-many column="LOC_ID" class="collectionorderby.Location"
                fetch="join" />
        </idbag>

    </class>
</hibernate-mapping>


Location.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
    <class name="collectionorderby.Location" table="LOCATION">
        <id name="locId" type="string">
            <column name="LOC_ID" length="50" />
        </id>

        <property name="locCode" type="string">
            <column name="LOC_CODE" length="50" />
        </property>
        <property name="city" type="string">
            <column name="CITY" length="50" />
        </property>
        <property name="cityLongName" type="string">
            <column name="CITY_LONG_NAME" length="500" />
        </property>

    </class>
</hibernate-mapping>

==== 編集 を提供するorder byと、変換されたクエリはselectテーブルの最初のインスタンスから取得されorder by、テーブルの 2 番目のインスタンスを使用して行われることに注意してください。これらのテーブルの重複インスタンスを回避すれば、これは起こらないと思います。

4

1 に答える 1

0

以下は期待どおりに機能しました。エイリアスlocListは select の代わりに使用されましたo.locationList

SELECT locList  FROM Order o join o.locationList locList  where o.orderId = 1 order by locList.city desc
于 2013-07-31T12:13:08.763 に答える