2015-03-13 3 views
1

Я возвращаюсь на Java через несколько лет, и это мой второй день, глядя на спящий режим и еще не совсем понял его.Hibernate Criteria.list() вызывает java.lang.ClassCastException

У меня есть следующие критерии, которые выполняют присоединиться:

Criteria cr = s.createCriteria(Bla.class, "bla"); 
cr.setFetchMode("bla.nodePair", FetchMode.JOIN); 
cr.createAlias("bla.nodePair", "node_pair"); 
cr.add(Restrictions.in("bla.blaName", (List<Bla>) getBlas())); 

ProjectionList columns = Projections.projectionList() 
    .add(Projections.property("node_pair.priNode")) 
    .add(Projections.property("bla.blaName")) 
    .add(Projections.property("node_pair.secNode")) 
    .add(Projections.property("bla.port")); 

cr.setProjection(columns); 
List<Object[]> list = cr.list(); // Exception occurs here 

Это создает насколько я могу сказать, правильный запрос SQL и именно то, что я после.

Однако, когда я пытаюсь создать список результатов cr.list(); я получаю:

java.lang.ClassCastException: com.some.package.domainobject.Bla cannot be cast to java.lang.String 

Как я должен построить свой список. Любые указатели очень ценятся.

+0

Ваш пример кажется, что это совсем что-то вы воспользовались практикой. Является ли вещь в базе данных типом класса 'Bla'? Вы положили его там? Вы могли бы попытаться прочитать другой объект из базы данных, и это отключит вас. – markspace

ответ

2

В Criteria API исключение всегда (?) Выбрано при попытке получить результаты.

В вашем случае проблематична линия, вероятно,

cr.add(Restrictions.in("bla.blaName", (List<Bla>) getBlas())); 

Вы, кажется, проверить, если java.lang.String является частью Collection<Bla>.

Если equals и hashcode методы в Bla использовать blaName поле, вы должны быть в состоянии использовать

cr.add(Restrictions.in("bla", (List<Bla>) getBlas())); 

В противном случае, реализует getBlasNames() функцию, которая возвращает List<String>

+0

Если я прокомментирую 'List list = cr.list();' тогда исключение не выбрасывается, поэтому я не верю 'cr.add (Restrictions.in (" bla.blaName ", (List ) getBlas())); 'есть проблема:/ – HGPB

+1

Нет SQL-genereated до того, как вы попытаетесь получить список результатов. Это то, что происходит, когда вы вызываете 'cr.list();'. – cghislai

+0

Вы совершенно правы. Не знаете, что вы говорите о методах 'equals' и' hashcode'? Можете ли вы привести пример? – HGPB

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