В моей конфигурации гибернации есть следующая карта, которая создает таблицу с составным первичным ключом:
<hibernate-mapping>
<class name="my.package.Item" table="item"
...
<map name="itemSources" table="item_source" lazy="false">
<key>
<column name="item_id" />
</key>
<map-key-many-to-many class="my.package.SourceProperties" column="source_id"/>
<element type="text" node="externalId">
<column name="external_id"/>
</element>
</map>
...
</class>
</hibernate-mapping>
Я пытаюсь запросить все «элементы», для которых «itemSources» включает в себя определенныйID источника.
Я пробовал несколько запросов HQL (показанных ниже), но безрезультатно.
1-й подход
select it.id from Item it where :srcid in elements (it.itemSources)
Это приводит к запросу значения карты, т.е. external_id (в отличие от ключа карты):
... where ('4' in (select itemsour2_.external_id from item_source itemsour2_
where item1_.id=itemsour2_.item_id))
2-й подход:
select it.id from Item it where :srcid in elements (it.itemSources.source_id)
Это дает исключение: org.hibernate.QueryException: невозможно разыменовать скалярный элемент коллекции: source_id
3-й подход:
select it.id from Item it join it.itemSources itsources where index(itsources.id) = :srcid
Это дает исключение: org.hibernate.PropertyAccessException: IllegalArgumentException произошел вызов вызывающего метода my.package.SourceProperties.id
Существует ли правильный способдостичь этого?