【问题标题】:HQL select from multiple tables从多个表中选择 HQL
【发布时间】:2014-02-11 08:16:15
【问题描述】:

这个查询:

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 语句。

但是,当我遍历 Child List 时,我在此循环的 for (int j = 0; j < allParent.get(i).getAllChild().size(); j++) { 行上得到 java.lang.ClassCastException

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(或其他东西)来运行此语句,并让它填充allParentListallChildList链接到allParent内的每个Parent ?

【问题讨论】:

  • child_id 是字符串变量吗,如果你展示你的模型类对我们会更有帮助
  • 请发布完整的堆栈跟踪。

标签: java mysql hibernate hql


【解决方案1】:

当您在 HQL 中使用投影时,您的结果将是 List。因此,对于每个结果行,您都有一个 Object[] 数组,根据您的预测,该数组具有以下数据类型。 {String, 你的模型对象, int/long, String}。因此,当您执行 allParent.get(i).getAllChild()i=0 时,您正在对 Object[] 数组执行 getAllChild() 并将结果为 ClassCastException

请在 HQL 中使用投影。

【讨论】:

  • 有没有办法我可以使用Criteria(或其他东西)来运行这个语句,并让它填充allParentListallChildList链接到每个@987654331 @ 内allParent?
  • 也许我可以以不同的方式配置我的Parent.hbm.xml 映射?
  • HQL 或标准,您可以通过将孩子与父母一起加入来获得父母及其所有孩子。并且在 HQL 中保持父级单独投影以迭代父级列表。那么你就不会期待任何 ClassCastException。
【解决方案2】:

在没有看到模型类的情况下,我最好的猜测是您想将“AND child_id = :childId”替换为“AND child.id = :childId”,或者您的 Child 类中标记的任何 id 列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多