2012-07-27 80 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