2017-02-17 3 views
1

Ich versuche, eine JPQL für eins zu viele Beziehung zu erstellen, nämlich Benutzer und Gerät als 1 Benutzer kann eins zu viele Geräte haben. Ich möchte das gesamte Objekt des Geräts finden, wenn es dem Benutzer gehört und der Gerätename korrekt ist.JPQL für One to Many Beziehung

Wenn es sich um eine SQL-Abfrage ist, dann kann ich die Abfrage nur tun, nur für das Gerät wie folgt:

select * from DEVICE where USER_ID = 2 and DEVICENAME = "mypc"; 

wo BENUTZER_ID der Fremdschlüssel in DEVICE-Tabelle. Aber wie kann ich die JPQL-Abfrage für die Benutzer- und Gerätetabelle durchführen? Hier sind einige Informationen für Benutzer- und Geräteklasse

@Entity 
public class User { 
@Id 
@GeneratedValue(strategy = GenerationType.TABLE) 
public int id; 
public String username; 
public String firstname; 
public String lastname; 
public String hashPassword; 

@OneToMany(mappedBy = "user") 
public List<Device> devices = new ArrayList<Device>(); 


} 

@Entity 
public class Device { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    public int id; 
    public String deviceName; 
    @ManyToOne 
    public User user; 
    String deviceOS; 
    String deviceType; 
    String attributes; 
    boolean standard; 
} 
+3

Und was haben Sie versucht? Hast du Dokumentation über JPQL gelesen? http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#hql-implicit-join –

Antwort

2

Beispiel JPA Abfrage: Documention

Query query = entityManager.createQuery("SELECT di FROM Device di JOIN di.user u WHERE u.id=:userId and di.deviceName=:deviceName"); 
query.setParameter("userId",userId); 
query.setParameter("deviceName",deviceName); 
List<Device> result = query.getResultList(); 
+0

Ich folge Ihrer Anfrage, aber es scheint überhaupt kein Ergebnis zu geben. Ist es notwendig, fetch beizutreten? –

+1

Sie müssen nicht 'holen'. Aber diese Abfrage stellt sicher, dass sich das Benutzerobjekt im Geräteobjekt befindet. – ozgur

+1

Versuchen Sie, LEFT JOIN FETCH anstelle von JOIN FETCH einzugeben. – ozgur

1

Sie JPQL path expressions in Ihrer Abfrage verwenden können, von einem Unternehmen zum anderen zu navigieren, oder Attribute eines Unternehmens zu beziehen.

Insbesondere Pfadausdrücke sind nützlich entlang @ManyToOne oder @OneToOne Beziehungen zu navigieren, z.B .:

SELECT d FROM Device d WHERE d.user.id = :userId AND d.deviceName = :deviceName 

Hier d.user.id ist ein Pfadausdruck.

Für einen allgemeinen Überblick über JPQL, werfen Sie einen Blick auf die große Wikibooks article.

+0

Ich folge Ihrer Anfrage, aber es scheint auch kein Ergebnis zu geben. Muss die Abfrage der Struktur der Datenbank oder der POJO-Klasse selbst folgen? Weil die POJO-Klasse nicht über die Benutzer-ID verfügt, da es sich um einen Vorgängerschlüssel handelt. –

+1

In JPQL-Abfragen verwenden Sie Attribute von Entitäten/POJOs. Das Datenbankschema spielt keine Rolle. Ihre 'Device'-Entity hat ein 'user'-Attribut, mit dem Sie' d.user' schreiben können, um von 'Device' zu ​​dessen' User' zu navigieren. In 'User' haben Sie wiederum das' id' Attribut, so dass Sie 'd.user.id' schreiben können. Stellen Sie sicher, dass in der Datenbank tatsächlich eine Entität vorhanden ist, die Ihren Bedingungen entspricht (ID und Gerätename), und befolgen Sie die Antwort von @jackk zum Abrufen der Abfrageergebnisse. –

+0

Ich folgte @jackk Antwort und es scheint jetzt zu arbeiten, aber ich denke theoritisch sollte es mit Ihrer Antwort arbeiten. Trotzdem danke! –