如何将简单的Hibernate连接结果映射到具有子对象的对象?

时间:2011-10-15 06:42:31

标签: hibernate mapping persistence hql classcastexception

我对如何查询包含子对象的对象列表感到困惑。

我有两个类执行和命令。在执行中,我将订单对象作为一对一的关系:

public class Execution {
    private long id;
    private Order order;
    ...

在Execution.hbm.xml中,我将Order配置为多对一,其唯一=“true”。

<class name="Execution" table="executions">
    <id name="executionId" type="long">
        <generator class="native" />
    </id>
    <many-to-one name="Order" unique="true" fetch="join" class="Order" />
</class>

通常,我们使用:

查询具有HibernateDAOSupport的Execution对象
List<Execution> executions = getHibernateTemplate().find("from Execution");

通过上述关系,我们如何查询它以及在哪里可以找到有关复杂连接的持久对象的更多信息?我试过了:

List<Execution> list = getHibernateTemplate().find("from Execution e left outer join e.order");

但它提供了一个ClassCastException,因为查询似乎没有返回Execution对象,并且在Execution中的Order对象中有额外的订单详细信息。

映射有问题吗?还是查询?

非常感谢任何指针!

- 更新

抱歉是个菜鸟。显然第一个查询有效。在阅读了大量关于HQL的文档后,他们对此并不清楚。任何更好的文档都会有所帮助。感谢...

2 个答案:

答案 0 :(得分:3)

这不起作用,因为您没有明确告诉您只需要结果中的执行实体。它无法弄明白,因为加入 order 实体也会导致 Order 属性成为结果的一部分。

List<Execution> list = getHibernateTemplate().find(
    "from Execution e left outer join e.order");

只需添加select即可正常使用:

List<Execution> list = getHibernateTemplate().find(
    "select e from Execution e left outer join e.order");

但是,将此类查询作为其他问题是否有意义,通常您不必在查询中进行连接以填充关系属性。是否通过将提取策略设置为LAZY / EAGER或依赖于默认值来控制它们是否已填充。

在您的情况下,仅当

时,查询才会存在于查询中
  1. 您希望按顺序按某些属性限制查询结果(在这种情况下,您还可以避免在HQL查询中使用JOIN,只需浏览路径:e.order.id = 2)或
  2. 与订单的关系很懒,您只想确保订单 获取:

    列表list = getHibernateTemplate()。find(     “来自执行e left outer join fetch e.order”);

答案 1 :(得分:0)

@ Mikko和@ JB的回答/评论是正确的。要查询子对象,只需更改行

List<Execution> list = getHibernateTemplate().find(
"select e from Execution e left outer join e.order");

List<Execution> list = getHibernateTemplate().find(
"select e from Execution e left outer join e.order as o where o.id = ?");