2014-01-21 3 views
2

Этот запрос:HQL выбрать из нескольких таблиц

Query query = HibernateUtil.getSessionFactory().getCurrentSession().createQuery("SELECT substring(a.account, 1, 6), a.ref, b.event_id, substring(a.admin, 1, :adminLength) FROM Parent a, Child b WHERE b.joinString = a.joinString AND b.event_id=:eventId AND substring(a.admin, 1, :adminLength) LIKE :admin AND a.date BETWEEN :from AND :to"); 

Производит заявление SQL, который работает в MySQL.

Однако, когда я Переберите ребенка List я java.lang.ClassCastException на линии for (int j = 0; j < allParent.get(i).getAllChild().size(); j++) { этого цикла:

for (int i = 0; i < allParent.size(); i++) { 
    System.out.println(allParent.get(i)); 
    for (int j = 0; j < allParent.get(i).getAllChild().size(); j++) { 
      System.out.println("Child: " + allParent.get(i).getAllChild().get(j).getID()); 
    } 
    HibernateUtil.getSessionFactory().getCurrentSession().flush(); 
    HibernateUtil.getSessionFactory().getCurrentSession().clear(); 
} 

Parent.hbm.xml

<bag name="allChild" table="child" inverse="true" lazy="true" fetch="select"> 
    <key property-ref="surname"> 
     <column name="surname" not-null="true" /> 
    </key> 
    <one-to-many class="com.test.Child" /> 
</bag> 

Есть ли способ, которым я может запустить это заявление, используя Criteria (или что-то еще) вместо этого и заселить и allParentList и allChildList связан с каждым Parent в пределах allParent?

+0

Является ли child_id строковой переменной, и это было бы более полезно для нас, если вы покажете свои классы моделей. – harrybvp

+0

Пожалуйста, разместите полную статистику стека. –

ответ

0

Не видя классов моделей, я бы предпочел бы, чтобы вы захотели заменить «AND child_id =: childId» на «AND child.id =: childId» или любой столбец id помечен в вашем классе Child.

0

Поскольку вы используете проекцию в HQL, ваш результат будет List. Таким образом, для каждой результирующей строки у вас есть массив Object [] со следующими типами данных в соответствии с вашими проекциями. {String, Ваш объект модели, int/long, String}. Итак, когда вы делаете allParent.get(i).getAllChild() и i=0, вы делаете getAllChild() на Object[] массив и результат ClassCastException.

Просьба ознакомиться с использованием прогнозов в HQL.

+0

Есть ли способ, которым я могу запустить этот оператор с использованием 'Criteria' (или что-то еще) вместо него и заполнить как' allParent'' List', так и 'allChild'' List', связанные с каждым' Parent' внутри 'allParent'? – ThreaT

+0

Возможно, я мог бы настроить сопоставление «Parent.hbm.xml» по-другому? – ThreaT

+0

HQL или Criteria, вы можете получить родителя вместе со всеми его дочерними элементами, присоединив ребенка к родительскому. И в HQL держите родительский только в проецировании для перебора родительского списка. Тогда вы не будете ожидать исключения ClassCastException. – Pokuri

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