hibernate(HQL)中的内部联接出现问题

hibernate(HQL)中的内部联接出现问题,hibernate,struts,hql,Hibernate,Struts,Hql,我使用的是Struts+Spring+Hibernate,我很难让我的HQL正确执行 我有四个对象,objectA、objectB、objectC和objectD。对象A与对象B具有一对多关系,它们之间的关系与对象B具有FK ObjectA.Id的关系相同。此模式通过对象继续,即对象B与对象C等有一对多关系 我现在正在做的是调用“fromObjectXVOwhereObjectXid=?”来获取对象列表。我的应用程序变得越来越复杂,所以我需要做一些更复杂的HQL 基本上,我需要的是,给定Obje

我使用的是Struts+Spring+Hibernate,我很难让我的HQL正确执行

我有四个对象,objectA、objectB、objectC和objectD。对象A与对象B具有一对多关系,它们之间的关系与对象B具有FK ObjectA.Id的关系相同。此模式通过对象继续,即对象B与对象C等有一对多关系

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

基本上,我需要的是,给定ObjectBVO.objectBId,我需要返回ObjectA中包含给定ObjectB的某些列,ObjectC中属于给定ObjectB的某些列,以及ObjectD中属于给定ObjectB的ObjectC的所有列

这是我在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
这是我试图用来返回列表的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);
}
列出对象;
试一试{
String hql=“选择ObjectBVO.objectBId,ObjectBVO.objectBName,
ObjectCVO.ObjectCD说明,ObjectCVO.objectCId,“
+ObjectAVO.objectAId、ObjectAVO.objectAName、ObjectDVO
+来自ObjectBVO、ObjectAVO、ObjectCVO、ObjectDVO
+“其中ObjectBVO.objectBId=?”
+“和ObjectAVO.objectAId=ObjectBVO.objectAId”
+“和ObjectBVO.objectBId=ObjectCVO.objectBId”
+“和ObjectDVO.objectCId=ObjectCVO.objectCId”;
objectDs=getHibernateTemplate().find(hql,objectBID);
}

这只会抛出一个表示null的错误。我已经看过HQL文档和一些教程,但不清楚如何在多个VO对象上实现这一点。有人能帮忙吗?谢谢。

您必须为实体分配别名,然后返回/使用这些别名

此外,根据您的描述,您的实体之间应该有一对一/多对一的关联,但您没有这种类型的关联。您所拥有的只是指向其他实体的ID

返回多个类似字段的查询不会返回ObjectDVO的实例。它将返回一个
列表
,其中每个
对象[]
将包含查询返回的一个值:索引0处的objectBId,索引1处的objectBName,等等

最后,VO确实不是一个实体。您的实体不应命名为VO。这基本上就像在动物身上附加一个
水果
后缀

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

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
有了众多的联想,你可以简单地做到

select d from D d
inner join fetch d.c c
inner join fetch c.b b
inner join fetch b.a a
您将得到一个
列表
。在每个D实例上,您可以

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

最后注意:属性是类的一部分。因此命名
objectAId
对象a的ID是多余的。将其命名为
id
objectA.getId()
objectA.getObjectAId()
可读性强得多,谢谢你的回答!我会尝试一下,如果我能让它工作,我会把它标记为已回答。