2014-01-22 3 views
0

Так у меня есть этот код:Hibernate класс литая исключение со списками

public List<FooRequirement> findByFoo(Foo foo) { 
    return getCurrentSession().createQuery("select distinct fr.foo from FooBarRequirement fr where fr.Foo.id = :FooId") 
      .setParameter("FooId", foo.getId()).list(); 
} 

Я называю этот код где-то в моем коде с

List<FooRequirement> myList = dao.findByFoo(foo); 

Тогда я получил ClassCastException и спрашивает, что я делаю неправильно , Я отлаживал свой код, и я видел, что мой список (myList), который должен содержать ссылки на объекты типа FooRequirement, фактически заполнен ссылками типа Foo.

Тогда я нашел свою ошибку:

return getCurrentSession().createQuery("select distinct fr from FooBarRequirement fr where fr.Foo.id = :FooId" 

Был «выберите отчетливый fr.foo», но она должна была «выберите отчетливый фр ...», потому что я хочу список FooRequirements не Foos.

Вопрос в том, как эта ссылка попала в список в первую очередь? Я имею в виду, как возможно, чтобы список удерживал foo?

Некоторые сведения о классах:

Все классы являются юридические лица, то есть таблицы БД для них.

Класс Foo имеет идентификатор поля и описание.

Класс FooRequirement является классом ABSTRACT и имеет ссылку на Foo (ManyToOne) и id. FooRequirement НЕ расширяет Foo.

Класс FooBarRequirement расширяет класс FooRequirement, если он является relavent. У этого есть поле Баз. (ManyToOne)

Я надеюсь, что вопрос ясен. На самом деле ситуация была немного сложнее, но я старался сделать ее максимально простой.

+1

Ну, я не понимаю ваш вопрос. «Я имею в виду, как можно, чтобы List держал foo?» - что вы имеете в виду? Почему «Список» не может содержать 'foo'? –

+0

Это список FooRequirements. И Foo не расширяет FooRequirement. –

+0

Вы уверены, что это не 'List '? От взгляда на ваш код, это то, что должен был сделать Hibernate. И это также не может быть передано в 'List '. –

ответ

2

Вы явно выбрать Foo объекты в запросе select distinct fr.foo...

Так что это тот тип, который заканчивается в вашем List.

EDIT: Вы определили список, который хотите иметь как List<FooRequirement>. Однако список результатов, который вы получаете от Session, не вводится и, следовательно, может содержать любые Object, в вашем случае - Foo.

Поскольку вы не можете получить TypedQuery из спящего режима Session, вы можете использовать EntityManager interface.

+0

Неужели в списке разрешено удерживать объекты FooRequirement? –

+0

Нет, список результатов, который вы пытаетесь вернуть, имеет это ограничение, но не список результатов из сеанса. – kostja

Смежные вопросы