0

我正在使用 Struts+Spring+Hibernate,我无法让我的 HQL 正确执行。

我有四个对象,objectA、objectB、objectC 和 objectD。对象 A 与对象 B 具有一对多关系,并且它们是相关的,因为 ObjectB 具有 FK ObjectA.Id。这种模式在对象中继续存在,即对象 B 与对象 C 等具有一对多的关系。

我现在一直在做的是调用“FROM ObjectXVO WHERE objectXId =?” 获取对象列表。我的应用程序变得越来越复杂,所以我需要做一些更复杂的 HQL。

基本上我需要的是,给定 ObjectBVO.objectBId 我需要返回具有给定 ObjectB 的 ObjectA 的某些列,作为给定 ObjectB 一部分的 ObjectC 的某些列,以及作为 ObjectC 一部分的 ObjectD 的所有列它们是给定 ObjectB 的一部分。

这是我在 Microsoft SQL Server 中使用的 SQL 语句。它正在工作,希望能展示我的模型。

SELECT ObjectB.ObjectBID, ObjectB.ObjectBName, ObjectC.ObjectCDescription, 
ObjectD.*, ObjectA.ObjectAID
FROM ObjectB, ObjectC, ObjectD, ObjectA
WHERE ObjectB.ObjectBID = 2 
AND ObjectA.ObjectAID = ObjectB.ObjectAID
AND ObjectB.ObjectBID = ObjectC.ObjectBID
AND ObjectD.ObjectCID = ObjectC.ObjectCID

这是我试图用来返回 List< ObjectDVO > 的 DAOimpl 对象中的代码

List<ObjectDVO> objectDs;
try{
String hql = "SELECT ObjectBVO.objectBId, ObjectBVO.objectBName,
    ObjectCVO.objectCDescription, ObjectCVO.objectCId,"
+" ObjectAVO.objectAId, ObjectAVO.objectAName, ObjectDVO"
    +" FROM ObjectBVO, ObjectAVO, ObjectCVO, ObjectDVO"
    +" WHERE ObjectBVO.objectBId = ?"
+" AND ObjectAVO.objectAId = ObjectBVO.objectAId"
+" AND ObjectBVO.objectBId = ObjectCVO.objectBId"
+" AND ObjectDVO.objectCId = ObjectCVO.objectCId";
objectDs = getHibernateTemplate().find(hql, objectBID);
}

这只是抛出一个错误,说 null。我查看了 HQL 文档和一些教程,但还不清楚如何执行更多多个 VO 对象。任何人都可以帮忙吗?谢谢。

4

1 回答 1

1

您必须为您的实体分配别名,并返回/使用这些别名。

此外,根据您的描述,您的实体之间应该有 OneToMany/ManyToOne 关联,但您没有任何此类关联。您所拥有的只是指向其他实体的 ID。

像这样返回多个字段的查询不会返回 ObjectDVO 的实例。它将返回 a List<Object[]>,其中每个Object[]都包含查询返回的值之一:索引 0 处的 objectBId、索引 1 处的 objectBName 等。

最后,VO 并不是一个实体。您的实体不应命名为 VO。这基本上就像Fruit在 Animals 上附加一个后缀。

无论如何,如果您保持实体如图所示(您不应该这样做,而是引入关联),您的查询应该如下所示:

select b.objectBId, b.objectBName, c.objectCDescription, c.objectCId,
       a.objectAId, a.objectAName, d
from ObjectBVO b, ObjectAVO a, ObjectCVO c, ObjectDVO d
where b.objectBId = ?
and a.objectAId = b.objectAId
and b.objectBId = c.objectBId
and d.objectCId = c.objectCId

使用 ManyToOne 关联,您可以简单地做

select d from D d
inner join fetch d.c c
inner join fetch c.b b
inner join fetch b.a a

你会得到一个List<D>. 在每个 D 实例上,你可以做

String nameOfA = d.getC().getB().getA().getName();

最后一点:属性是类的一部分。所以命名objectAId的IDObjectA是多余的。命名它idobjectA.getId()objectA.getObjectAId().

于 2012-07-27T14:30:28.503 回答