2017-06-14 5 views
1

Ich schreibe einen Dienst mit JPA und Postgres db. Ich habe eine Klasse mit dem Namen Student:JPA (@OneToMany) Abfrage ohne Beitritt Kind Tabelle

public class Student { 
    @id 
    private String id; 

    private String firstName; 
    private String lastName; 

    @OneToMany(targetEntity = Phone.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "student_id", referencedColumnName = "id") 
    private Set<Phone> phones; 

    // Setter and Getter 
} 

und Telefon Klasse:

public class Phone { 
    @id 
    private String id; 

    private String number; 

    // Setter and Getter 
} 

Jetzt wird es in meinem db zwei Tabellen sein, folgende sind Spalten in ihnen:

Schüler: id, vorname, nachname

Telefon: id, Zahl, STUDENT_ID(erzeugt durch @JoinColumn)

Jetzt jedes Mal, wenn ich den Schüler abfragen, wird JPA den Telefontisch in Schülertisch verbinden und das Schülerergebnis enthält die Telefoninformationen dieses Schülers. Das ist genau was ich will.

Aber jetzt traf ich ein Problem. Wenn ich die Liste der Schüler abfrage, ist die Telefoninformation in diesem Fall nicht nützlich, nur die Identifikation, firstName und lastName sind notwendig. Aber JPA macht die gleiche "Join" -Operation auch für mich. Ich weiß, das kostet viel Zeit. Wie könnte ich in einem solchen Fall die Informationen einfach in den Schülertisch zurückgeben? Ohne den Telefontisch zu betreten?

Ich habe versucht, etwas im Repository wie

@Query(SELECT s.id, s.firstName, s.lastName FROM student s) 
public List<Student> findAllStudentWithoutPhone(); 

aber es gibt mir die Liste der Werte, aber nicht in einen Student Objekt umgewandelt. Wie kann ich diese Funktion erreichen?

Antwort

2

In dem Eins-zu-viele-Mapping (siehe unten) können Sie den Typen holt eingestellt haben holen = FetchType.LAZY daher überwintert nicht Abruf eingestellt von Telefonen an die Schüler faul entsprechen, bis Sie den Satz zugreifen von Telefonen über Getter-Methode, so brauchen Sie sich keine Sorgen zu machen.

@OneToMany(targetEntity = Phone.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name = "student_id", referencedColumnName = "id") 
private Set<Phone>; 

jedoch für den Fall, müssen Sie überprüfen, ob die Dinge arbeiten gut oder nicht, können Sie die Eigenschaft show_sql auf true gesetzt und überprüfen Sie die SQL über Hibernate generiert.

2

fetch = FetchType.LAZY bietet Ihnen die Möglichkeit, Phone Tabelle bis zum ersten Aufruf aus dem Code nicht abzufragen. Bitte beachten Sie: http://docs.oracle.com/javaee/7/api/javax/persistence/FetchType.html#LAZY

Im Fall, wenn Sie die Liste der Schüler ohne Telefone Abfrage sollte abrufen möchten: @Query(SELECT * FROM student s where phones IS NULL)

Für die Ergebnisse automatisch in Studenten Objekt konvertieren bitte s.id, s.firstName, s.lastName in Ihrer Abfrage nicht verwenden.

1

Antwort von @Sahil ist absolut richtig, aber das hinzuzufügen.

@Cong Sie müssen FetchType.LAZY nicht hinzufügen, da es standardmäßig bereits LAZY ist. & als eine Notiz die Student-Klasse-Eigenschaft für Telefon fehlt Variablenname.

+0

Vielen Dank @mAc, die Variable wurde hinzugefügt. –

Verwandte Themen