2009-08-19 4 views
2

У меня есть отображение гибернации, который выглядит примерно так:Hibernate Критерии содержит в об ассоциации к столу

<class name="MyEntity"> 
    <set name="scalarSet" table="(select fk, scalar_value from other_table)"> 
    <key column="fk"/> 
    <property column="scalar_value" type="long"/> 
    </set> 
</class 

Учитывая это, как я запрос таким образом, что значение MyEntity.scalarSet (который Set) находится в другой коллекции.

Что-то вроде:

criteria.add(Restrictions.in("scalarSet", targetList)); 

[править] Я также попытался Restriction.sqlRestriction (..). Запрос SQL, который я использовал что-то вроде этого:

"1 == (select fk, scalar_value from other_table where fk = {alias}.id and scalar_value in ({expanding?})" 

В чем {?} Расширение 'заменяется разделенных запятыми вопросительных знаков (в зависимости от targetList.size()).

Но я просто получаю

Вызванный: org.hibernate.MappingException: коллекция не была ассоциация: MyEntity.scalarSet

ответ

3

Ваш набор представляет собой коллекцию, не ассоциация картирование - есть тонкие, но важные различия. Использование API запросов Hibernate для коллекций в настоящее время not supported.

Вам нужно либо использовать HQL или использовать отображение в один-ко-многим ассоциации, создавая объект с Лонг собственности, например:

public class Scalar { 
    private Long value; 
    public Long getValue() { .... } 
    public void setValue(....) { ....} 
} 
+1

Спасибо, после взлома с источником спящего режима, это то, что я закончил делать :-) –

2

Однако, кто-то написал patch, который может или не заканчивается в Hibernate 3.4