2010-02-09 81 views
1

我對sql一般不熟悉,所以使用Hibernate就像是在我確切地知道問題是什麼之前尋找答案。請隨時糾正我的錯誤。我在一個項目中,我必須使用Hibernate。我所做的大部分工作都非常基礎,我可以複製和修改。使用Hibernate做涉及兩個表的查詢

現在我想做一些不同的事情,我不知道配置和語法是如何結合在一起的。假設我有兩張桌子。

表A有兩個(相關)列,用戶GUID和管理器GUID。很明顯,管理者可以有多於一個用戶,因此對經理的查詢可以返回多行。此外,經理可以在多個項目上管理同一用戶,因此可以多次爲相同的經理查詢返回同一用戶。

表B有兩列,用戶GUID和用戶全名。一對一映射。

我想通過獨特的用戶從表A,組他們做經理GUID查詢GUID(所以相同的用戶是不會在結果中兩次),然後從表B.

返回這些用戶的全名

我可以在沒有太多麻煩的情況下做到這一點,但我想使用Hibernate,所以我不必手動解析sql結果。這是使用Hibernate的要點之一,不是嗎?

現在我有一個Hibernate映射,它將表A中的每一列映射到一個DAO對象中的一個字段(以及get/set方法,我猜),我只是爲了保存表的數據而編寫的。

我也可以使用Hibernate DAO,我必須分別訪問每個表,並在單獨的步驟中執行上面提到的每個事情,但這樣做效率會更低(我假設)執行一個查詢。

我寫了一個服務對象來保存從查詢返回的數據(我的示例是簡化的 - 我將保留表A的一些其他數據並從表B獲取多個列)但我在如何編寫一個可以進行連接的DAO,或者使用DAO來完成連接。

僅供參考,這裏是我的Hibernate配置文件的樣本(簡化,以配合我的例子):

<hibernate-mapping package="com.my.dao"> 
    <class name="TableA" table="table_a"> 
    <id name="pkIndex" column="pk_index" /> 
    <property name="userGuid" column="user_guid" /> 
    <property name="managerGuid" column="manager_guid" /> 
    </class> 
</hibernate-mapping> 

所以後來我有一個DAOImplementation的類,它查詢並返回列表像

public List<TableA> findByHQL(String hql, Map<String, String> params) 

等我不知道如何「最佳做法」即是。

回答

3

好的。首先,我注意到你主要是在談論你的問題中的表格,所以我認爲你錯過了關於Hibernate的一個重要觀點。休眠是一個ORMObject-Relational Mapping)工具,它是一個工具,幫助地圖對象關係模型並使用對象範例操縱數據。

所以,在使用Hibernate時,實際上應該考慮它們之間有關聯的對象,而不是表。而對象,我的意思是商業實體ProjectEmployee,而不是DAO。 DAO是一種以技術無關的方式(JDBC,Hibernate等)對數據訪問層建模的方法,它們不代表數據庫記錄。Hibernate映射文件用於將這些實體映射到表並描述它們的關聯。

而不是「表A」和「表B」

換句話說,我希望閱讀類似的信息(這只是過程的示例):

我有一個Employee類,Employee能以Project作爲項目成員或項目經理工作。我爲ProjectEmployee之間的團隊成員以及ProjectEmployee之間的多對一關聯使用了項目經理之間的多對多關聯。下面是Hibernate映射文件和相應的Java類...

然後,要查詢此模型,您應該再次考慮對象。同樣,這個例子是虛構的(它並沒有真正意義的無對象模型和相關映射),但你的HQL查詢看起來是這樣的:

select distinct project.teamMembers 
from Project as project 
where project.projectManager.id=:id 

總之,我認爲你需要重新考慮你的問題和解決問題的方式。現在,你似乎走錯了路。

+0

啊。然後在這個虛構的模型中,我會查看團隊成員的名單,得到他們的全名? 後續問題:在Hibernate中,我可以有多個到同一個表的映射嗎?換句話說,我可以保留當前獨立的映射,併爲我需要的對象創建一組替換的映射到一些相同的表中。 – 2010-02-09 16:28:17

+0

@Nathan第一個問題:是的。第二個問題:是的,你可以有幾個實體(因此有多個映射)映射到一個表。 – 2010-02-09 16:40:01