2012-07-27 79 views
0

我正在使用Struts + Spring + Hibernate,并且无法正常执行我的HQL。内部连接处于休眠状态(HQL)的问题

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

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

基本上我需要的是,给定ObjectBVO.objectBId我需要返回给定ObjectB的ObjectA的某些列,给定ObjectB的一部分的ObjectC的某些列以及ObjectDs的所有列作为给定ObjectBs的一部分的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代码对象,我尝试使用返回列表< ObjectDVO>

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); 
} 

这只是抛出一个错误说空。我已经看过HQL文档和一些教程,但不清楚如何做更多的VO对象。谁能帮忙?谢谢。

回答

1

您必须为您的实体指定别名,并返回/使用这些别名。此外,根据你的描述,你应该在你的实体之间有OneToMany/ManyToOne关联,但是你没有任何类型的关联。你所拥有的是指向其他实体的ID。

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

最后,VO精确地不是实体。您的实体不应被命名为VO。这基本上就像在动物上添加Fruit后缀。

无论如何,如果你保持实体如图所示(你不应该这样做,但是引入联想代替),您的查询应该是这样的:

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 

你会得到一个List<D>。在每个d例如,你可以在做

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

最后一个音符:一个属性是一个类的一部分。所以命名为objectAIdObjectA的ID是多余的。将其命名为idobjectA.getId()objectA.getObjectAId()更具可读性。

+0

感谢您的好评!我会试试这个,并将其标记为已回答,如果我可以得到它的工作。 – user1287523 2012-07-27 14:47:27

+0

作品非常漂亮 – user1287523 2012-07-27 16:00:11