Запросите Hibernate ассоциацию «многие ко многим» - PullRequest
2 голосов
/ 17 мая 2010

В Hibernate HQL, как бы вы опрашивали через ассоциацию «многие ко многим». Если у меня есть Компания с несколькими ProductLines, и другие компании могут предлагать эти же линейки продуктов, у меня есть компания Company, компания ProductLine и таблица ассоциации CompanyProductLine. В SQL я могу получить то, что мне нужно, вот так:

select * from company c where c.companyId in (select companyId from companyProductLine cpl, productline pl where cpl.productLineId = pl.productLineId and pl.name= 'some value');

Моя проблема связана с ассоциацией, которую я определил в файле Company.hbm.xml:

<set name="productLines" 
     cascade="save-update" 
     table="CompanyProductLine">
   <key column="companyId"/>
   <many-to-many class="com.foo.ProductLine" column="productLineId" />
</set> 

Любой HQL, который мне, кажется, придет, выдаст исключение Hibernate: «ожидающие» элементы или «индексы».

Мысли о том, каким будет правильный HQL?

1 Ответ

4 голосов
/ 17 мая 2010

Ваш запрос hql должен выглядеть следующим образом:

from Company c join c.productLines pl where pl.name = :name

И отображение так:

<hibernate-mapping>
    <class name=com.example.ProductLine" table="productLine">
        <cache usage="read-write"/>
        <id name="id" column="id" type="long">
            <generator class="native"/>
        </id>
        <property name="name" column="name"/>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="com.example.Company" table="company">
        <cache usage="read-write" />
        <id name="id" column="id" type="long">
            <generator class="native" />
        </id>
        <set name="productLines" table="companyProductLine" lazy="false">
            <key column="companyId" />
            <many-to-many class="com.example.ProductLine" column="productLineId" />
        </set>
    </class>
</hibernate-mapping>
...