HQL从多个表中选择

时间:2014-01-21 16:03:15

标签: java mysql hibernate 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");

生成一个适用于MySQL的SQL语句。

但是,当我循环访问子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(或其他内容)来运行此语句,并让其填充allParent ListallChild ListParent内的每个allParent相关联?

2 个答案:

答案 0 :(得分:0)

如果没有看到模型类,我最好的猜测是你想用'AND child.id =:childId'替换'AND child_id =:childId',或者在你的Child类中标记id列。< / p>

答案 1 :(得分:0)

当您在HQL中使用投影时,您的结果将是List。因此,对于每个结果行,您有一个Object []数组,其中包含根据您的投影的以下数据类型。 {String,您的模型对象,int / long,String} 。因此,当您执行allParent.get(i).getAllChild()i=0时,getAllChild()数组上Object[] ClassCastException将会生成{{1}}。

请在HQL中使用投影。