2017-07-03 14 views
2

Meine Einheit von Produkt sieht wie folgt:Hibernate-Abfrage SQL-Abfrage

@Entity 
@Table(name = "order") 

public class OrderEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "order_id") 
    private Long id; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(
     name = "order_products", 
     joinColumns = @JoinColumn(name = "order_id", referencedColumnName = "order_id"), 
     inverseJoinColumns = @JoinColumn(name = "product_id", referencedColumnName = "id") 
    ) 
    private Set<ProductEntity> products = new HashSet<>(); 
} 

ProductEntity:

@Entity 
@Table(name = "product") 
public class ProductEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @Column(unique = true) 
    private String name; 

    @ManyToMany(mappedBy = "products") 
    private Set<OrderEntity> orders = new HashSet<>(); 
} 

Ich möchte alle Aufträge bekommen, wo Produktnamen gewünschten Wert entspricht. Und ich schreibe SQL-Abfrage, um das Ergebnis aus der Datenbank zu erhalten, aber ich kann keine Hibernate-Abfrage für Spring Data JPA schreiben.

Meine Anfrage für postgreSQL sieht wie folgt aus:

SELECT o.order_id, op.product_id, p.name 
    FROM public.order o 
    INNER JOIN public.order_products op 
    ON p.order_id = op.product_id 
    INNER JOIN public.product p 
    ON op.product_id = p.id 
    WHERE p.name = 'Foo'; 

Und diese Abfrage zurückgeben mir eine ID von Ordnung, product_id und Produktname. Und das funktioniert. Aber ich wusste nicht, wie ich diese Frage als Spring Query mit @Query schreiben sollte.

brauche ich eine metohod in meinem Repository:

@Repository 
public interface OrderRepository extends JpaRepository<OrderEntity, Long> { 
    @Query("") <- place for my query in Hibernate sql 
    List<OrderEntity> findAllByProductName(@Param("name") String name); 
} 
+0

Sie beitreten Lesen Sie die Dokumentation? Die Sprache heißt HQL (oder JPQL). Nicht Hibernate SQL. Lesen Sie https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#hql und probieren Sie etwas aus. Ihre Abfrage ist ziemlich einfach zu schreiben, wenn Sie sich die Zeit nehmen, die Dokumentation und die Beispiele zu lesen und Dinge auszuprobieren. –

Antwort

1

versuchen Sie dies: (es gibt volle OrderEntity Objekte)

@Query("select o from OrderEntity o join o.products prod where prod.name = :name") 
List<OrderEntity> findAllByProductName(@Param("name") String name); 

, wenn Sie alle Daten für Produkte holen müssen eifrig benutzen .... OrderEntity o beitreten o.products ... in Abfrage statt OrderEntity o o.products

1

Dies ist eine Projektion von Spalten aus vielen entties aus, so würden Sie für die Ergebnisklasse Strategie gehen.

Grundsätzlich Sie eine POJO-Klasse mit den erwarteten Ergebnis schaffen Felder ein ein Ersatz Konstruktor:

public class ResultClass{ 

    private Integer orderId; 
    private Integer productId; 
    private String name; 

    public ResultClass(Integer orderId, Integer productId, String name){ 
     // set the fields 
    } 
} 

Sie dann die Abfrage ein wenig ändern:

SELECT new com.mypkg.ResultClass(o.order_id, op.product_id, p.name) 
FROM public.order o 
INNER JOIN public.order_products op 
    ON p.order_id = op.product_id 
INNER JOIN public.product p 
    ON op.product_id = p.id 
WHERE p.name = 'Foo'; 

Und die auf der Schnittstelle Rückgabetyp ändern Methode:

+0

Ich habe es nicht verstanden. Ich erkundige mich nach allen Bestellungen, bei denen der Produktname dem gewünschten Wert entspricht. – user

+0

Mmm ... ok in diesem Fall ist das sowieso eine zu triviale Antwort. Bitte lesen Sie die Dokumentation, wie @JB Nizet darauf hingewiesen hat. Aber am Ende, wenn Sie Spalten aus mehreren Tabellen wie in Ihrer Frage erhalten möchten .. dann hoffentlich mein Beitrag würde sich als nützlich erweisen –

+0

Diese Antwort ist sowieso falsch. Sie verwenden immer noch eine SQL-Abfrage und keine JPQL-Abfrage. –