2016-12-27 7 views
0

Ich habe 4 Tabellen CustomerEntity, CustomerMaster, Anforderungs- und UserMaster
und folgende Struktur der Tabellen haben,Wie verbinden Sie mehrere Tabellen in 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) 

, wenn ich wie dieser es

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

eine Abfrage aus dem Ruhezustand zu machen bietet Ich habe die richtigen Daten, die ich brauche, aber jetzt gibt es einen Fall, in dem ich die UserMaster-ID und auch die CustomerMaster-ID erfassen muss, die nur durch Verbinden der UserMaster- und CustomerMaster-Tabelle mit der vorhandenen Abfrage abgerufen werden kann. Ich bin mir nicht sicher, wo ich bekomme alle projizierten Daten wie in der obigen Abfrage Ich bekomme die Daten auf 'c', aber in der neuen Abfrage möchte ich alle Werte aus der Abfrage nach dem Beitritt alle diese 4 Tabellen ausgeführt werden.

Ich verwende die folgende Abfrage:

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

in dem Ruhezustand, wie dies, aber es scheint nicht zu funktionieren.

Antwort

1

Es ist möglich, eine beliebige Anzahl von Tabellen im Hibernate (JPA) zu verbinden. Wie die Daten zurückgegeben werden, hängt von den Anforderungen Ihrer Geschäftsanforderungen ab.

In Ihren Beispielen scheint es, dass Sie native SQL-Abfragen erstellen, die einen StringBuilder/StringBuffer nutzen, richtig? Das ist nicht nötig, resp. in den meisten Fällen nicht hilfreich.

Normalerweise wird Hibernate angewendet, um zugeordnete Entitäten zurückzugeben, mit anderen Worten, Java-Objekte, die die Daten Ihrer Datenbanktabellen darstellen. Dann können Sie mit diesen Objekten arbeiten, indem Sie ihre Zugriffsmethoden und Mutatoren (Getter und Setter) im aktuellen Persistenzkontext oder sogar in einem losgelösten Zustand verwenden.

Mit dem Hibernate-Mapping können Sie Beziehungen definieren, die Ihnen den Zugriff auf alle zugewiesenen Objekte ermöglichen, indem Sie über Java-Methodenaufrufe durch das Diagramm navigieren.

Vielleicht werfen Sie einen Blick here.

Aber das setzt voraus, dass Sie die Fähigkeiten der ORM-Schicht verwenden, um auf die Daten zuzugreifen, dh Entitätsabfragen (Zugriffsmethoden), die im Session/EntityManager-Objekt aufgerufen werden, eine HQL/JPQL-Abfrage oder die Criteria-API.

This und this sollten Sie weitere Informationen geben.

Stellen Sie sich vor, Sie hätten eine Zuordnung, die es erlauben würde, dass es völlig ausreichend wäre, eine HQL-Abfrage wie z.B. SELECT c FROM CustomerEntity AS c, die eine einzelne Entität zurückgeben würde. Über seine Accessoren können Sie durch Ihre Grafik navigieren.

Es ist auch möglich, zu schreiben, schließt sich in HQL, in diesem Fall müssen Sie nur sagen, welche Entitäten wie SELECT c FROM CustomerEntity AS c JOIN c.request AS r ... verbunden sein sollte und Sie können die ON Klausel in den regulären Fällen verzichtet werden. Hibernate weiß, wie die Entitäten aufgrund der Zuordnung verbunden sind.

Natürlich sollten Ihre Mappings in Bezug auf das Abrufen der richtigen Datenmenge (eifrig vs. faul) & (unidirektional vs. bidirektional) gut durchdacht sein. In manchen Fällen ist es sogar besser, Abfragen zu schreiben, die auf Ihren Anwendungsfall zugeschnitten sind, als über Java-Methoden zu navigieren, um Leistungseinbußen zu vermeiden. Dies müssen Sie je nach Datenstruktur und Datengröße entscheiden.

Last but not least können Sie auch native SQL queries verwenden, wenn Sie das brauchen, aber dann müssen Sie selbst darauf achten, es auf Java-Objekte abzubilden.

Verwandte Themen