2016-12-27 54 views
0

我有4個表CustomerEntity,CustomerMaster,請求和UserMaster
和具有以下表的結構,如何在Hibernate中連接多個表?

CustomerEntity (id,address,branch,branch_id,city,entity_status,request_id,user_master_id) 
CustomerMaster (id,customer_name,customer_type) 
UserMaster(id,customer_master_id,employee_id,unique_id,employee_id) 
Request(id,customer_master_id,parent_request_id,request_status,user_master_id) 

當我正在做一個查詢從休眠這樣

sb.append("select c from CustomerEntity c, Request r ") 

它提供我正確的數據,我需要,但現在有一種情況下,我需要捕獲UserMaster ID以及CustomerMaster ID值,這隻能通過加入UserMaster和CustomerMaster表與現有的查詢來獲取,但我'我不知道我在哪裏將獲得所有預計的數據,如上述查詢我收到'c'的數據,但在新的查詢中,我希望在加入所有這4個表後執行查詢中的所有值。

我使用下面的查詢:

sb.append("select * from (CustomerEntity as c join Request as r 
    on r.id = c.request_id) 
    left join CustomerMaster as c1 on r.customer_master_id = c1.id 
    left join UserMaster as u 
    on r.customer_master_id = u.customer_master_id"); 
在Hibernate這樣

,但它似乎沒有工作。

回答

1

可以在休眠(JPA)中加入任意數量的表。應該如何返回數據取決於您的業務需求。

在你的例子中,你似乎正在利用StringBuilder/StringBuffer創建本地SQL查詢,對吧?這不需要,分別。在大多數情況下沒有幫助。

通常hibernate用於返回映射的實體,換句話說,表示數據庫表的數據的Java對象。然後,您可以在當前持久化上下文中使用它的訪問器和增變器(getter和setter)來處理這些對象,或者甚至在分離狀態下使用它。

通過hibernate映射,您可以定義關係,允許您通過Java方法調用瀏覽圖形來訪問所有分配的對象。可以看看here

但是,這假定您使用ORM層的能力來訪問數據,這意味着要麼在Session/EntityManager對象,HQL/JPQL查詢或使用Criteria API調用實體查詢(訪問方法)。

Thisthis應該給你進一步的信息。假設你有一個映射,它將允許它完全足以編寫一個HQL查詢,例如, SELECT c FROM CustomerEntity AS c這將返回一個單一的實體。通過訪問器,您可以瀏覽圖表。

也可以在HQL中編寫聯接,在這種情況下,您只需告知哪些實體應該加入,如SELECT c FROM CustomerEntity AS c JOIN c.request AS r ...,在常規情況下可以省略ON子句。由於映射,Hibernate知道實體是如何連接的。

當然,您的映射關於提取適量的數據(急切與懶惰)&(單向與雙向)應該考慮周全。在某些情況下,編寫針對您的用例的查詢甚至會比通過Java方法導航以避免性能損失更好,但這是您必須根據數據結構和數據大小來決定的。

最後但並非最不重要的一點,如果您需要,也可以使用native SQL queries,但是您必須自行考慮將它映射到Java對象。

相關問題