2016-04-28 6 views
0

Ich habe die folgende Struktur für eine Java-Persistenz-Entity-Tabelle:Wie wird Spring @Query mit einer Sammlung von Elementen verwendet, um den korrekten Join zwischen zwei Tabellen zu erstellen?

@Entity 
@Table 
public class Product { 

    @Id 
    private String id; 

    @Column 
    private String name; 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<Price> prices; 

    // getters and setters 
} 


@Entity 
@Table 
public class Price { 

    @Id 
    private String id; 

    @Column 
    private Float value; 

    @Column 
    private Strung type; 

    // getters and setters 
} 

Die Datenbank HQL ist. Tabellen wurden automatisch erstellt, so habe ich diese Struktur mit 3 Tabellen:

CREATE MEMORY TABLE PRODUCT (ID VARCHAR(255) NOT NULL PRIMARY KEY, NAME VARCHAR(255)) 
CREATE MEMORY TABLE PRICE (ID VARCHAR(255) NOT NULL PRIMARY KEY, VALUE DOUBLE, TYPE VARCHAR(255)) 
CREATE MEMORY TABLE PRODUCT_PRICE (PRODUCT_ID VARCHAR(255) NOT NULL, PRICES_ID VARCHAR(255) NOT NULL, CONSTRAINT FK_SJ093JT9KRVI6PN4LQBDO30FU FOREIGN KEY(PRICES_ID) REFERENCES PRICE(ID),CONSTRAINT FK_H70YJF4SF4ABLK7MSXXV648Q9 FOREIGN KEY(PRODUCT_ID) REFERENCES PRODUCT(ID),CONSTRAINT UK_QJ093JT9KRVI4PN2LQBDO30FU UNIQUE(PRICES_ID)) 

Die „Zwischen“ Tabelle PRODUCT_PRICE enthält nur zwei Felder (die IDs der zwischen Produkt und Preis zu machen verbinden).

Hier gibt es einige Beispieldaten:

INSERT INTO PRODUCT ('PRD001','Product 1'); 
INSERT INTO PRICE ('PRC001', 1000, 'euro'); 
INSERT INTO PRICE ('PRC002', 50, 'tax'); 
INSERT INTO PRODUCT_PRICE ('PRD001','PRC001'); 
INSERT INTO PRODUCT_PRICE ('PRD001','PRC002'); 

Ich habe eine Abfrage auf der PPV-Repository zu tun alle Produkte und dessen Preistyp suchen = ‚Euro‘.

Ich möchte wie mit etwas Frühlings @Query, verwenden:

@Query("select p from Product p where p.prices.type = 'euro'") 

Wie kann ich die richtige beitreten machen? Meine Beispielabfrage erzeugt eine Hibernate-Ausnahme.

Danke.

Antwort

1

Sie können der Abfrage einfach eine Join-Klausel hinzufügen.

@Query("SELECT p FROM Product p JOIN p.prices pr WHERE pr.type = 'euro'")

Aber wie Sie bereits Spring Data verwenden, würde ich nur Beratung Abfragemethoden anstelle individuelle Anweisungen für solche einfachen Fall des Schreibens.

+0

Ja, das ist genau das, was ich brauchen! Es funktioniert perfekt! Vielen Dank. –

0

Versuchen Sie dieses, ohne @query Anmerkung

My-Code

List<User> findAllByAuthorities(Authority authority); 

Für u, übergeben Sie Preis Objekt, in dem Typ 'Euro'

List<Product> findProductsByPrices(Price price); 
+0

Vielen Dank für Ihren Vorschlag, aber mein Beispiel berichtet nur ein paar Felder. Mein Ziel ist es, eine komplexe Abfrage mit mehr als nur einem Feld zu erstellen, also brauche ich die Query-Annotation und nicht eine einzige "find ...()" -Methode. –

+0

Mithilfe von Spring Data Query-Methoden können Sie auch komplexe Abfragen erstellen. Dies ist immer mein momentan bevorzugter Weg, anstatt JPQL zu schreiben. http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation – Vaelyr