2016-07-28 14 views
2

So habe ich ein Dokument, das Überarbeitungen in meiner Datenbank hat. Die Dokumententabelle enthält Metadaten, die für das Dokument universell sind, und die Revision hat den Inhalt. Zurzeit kann ich das Dokument mit der korrekten Revision erhalten.Liste der Elemente von der Inverside-Seite einer ManyToOne-Beziehung

Was ich tun möchte, ist eine Liste der Dokumente von allen Revisionen mit den Zuordnungen erhalten.

Hier sind meine zwei Entitys:

@Entity 
public class Document { 
    @Id 
    @Column(name="DOCUMENT_ID") 
    private int id; 

    @ManyToOne 
    @JoinColumn(name="DOCUMENT_REVISION_ID") 
    private DocumentRevisionEntity revision; 
} 

@Entity 
public class DocumentRevisionEntity { 
    @Id 
    @Column(name="DOCUMENT_REVISION_ID") 
    private int id; 

    @Column(name="DOCUMENT_ID") 
    private int documentId 
} 

Also, welche Art von JPA-Abfrage würde ich all die Änderungen abfragen wollen, aber der Rückgabetyp von Document sein.

+0

Was meinst du mit: "' Liste 'von allen Revisionen" ?? Wollen Sie eine Liste von Dokumenten einschließlich für jedes Dokument seine verschiedenen Revisionen erhalten? –

+0

@CarlitosWay ja, tut mir leid, ich werde das beheben, aber die Idee ist, ich möchte alle Revisionen bekommen, aber sie als 'Dokument' bekommen. –

+0

Ich kann das nicht gut verstehen ... könnte das sein, was du willst: 'SELECT Dokument doc WHERE doc.revision IN (listOfRevisions)'? Wenn ja, kann ich detailliert – Dherik

Antwort

1

Der einfache Weg zu tun, was Sie wollen, ist Ihre Document Entität zu ändern.

Sie benötigen einen List<DocumentRevisionEntity> hinzufügen, dass es alle Revisionen einer Document Beispiel ... Beispiel im Zusammenhang darstellen:

@Entity 
public class Document { 
@Id 
@Column(name="DOCUMENT_ID") 
private int id; 

@ManyToOne 
@JoinColumn(name="DOCUMENT_REVISION_ID") 
private DocumentRevisionEntity revision; // This is the last revision! 

@OneToMany 
@JoinColumn(name="DOCUMENT_ID") // unidirectional one-to-many, works for JPA2.0!! 
private List<DocumentRevisionEntity> revisions = new ArrayList<>(); 
} 

dann, wenn Sie ein Dokument von Ihrem Persistence Layer abzurufen, können Sie abrufen seine auch zugehörige Revisionen!

ACHTUNG! Standardmäßig sind @OneToMany-Beziehungen LAZY und werden nur bei Bedarf geladen! (Das heißt, wenn Sie die Methode getRevisions() von einer Document Entität aufrufen, die von einer EntityManager verwaltet wird). Abhängig von Ihrem Kontext kann diese Konfiguration das Subselect-Problem N+1 verursachen, also Vorsicht.

Wenn Sie nicht wollen, Ihre Einheit ändern ... Sie können diese Abfrage testen:

SELECT doc, rev FROM Document doc, DocumentRevisionEntity rev WHERE doc.id = rev.documentId

jedoch, wenn Sie anrufen: query.getResultList() aus dieser Abfrage; es wird eine List<Object[]> wo jedes Element besteht aus einem Array wie folgt: Array [0] = Dokument, Array [1] = DocumentRevisionEntity ... Wenn es Dokumente mit vielen Versionen gibt, werden diese Dokumente in der Ergebnisliste wiederholt ...

+0

Die Übung war zu versuchen, keine weitere Eigenschaft hinzuzufügen, aber wenn ich muss, werde ich, nur ein Gedankenexperiment, lassen Sie mich diese Abfrage testen und sehen, was passiert, und ich werde zurück melden. –

+0

Yup, diese Abfrage funktioniert wie erwartet, ordentlich, danke! –