2017-07-03 2 views
2

Mon entité produit ressemble ci-dessous:requête Hibernate à la requête Sql

@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<>(); 
} 

Je veux obtenir toutes les commandes où le nom du produit est égal à la valeur désirée. Et j'écris sql query pour obtenir le résultat de la base de données, mais je ne peux pas écrire la requête hibernate pour Spring Data JPA.

Ma requête pour postgreSQL ressemble à ceci:

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'; 

Et cette requête me retourne un identifiant de l'ordre, product_id et le nom du produit. Et ça fonctionne. Mais je ne savais pas comment écrire cette question en tant que requête de printemps en utilisant @Query.

je besoin d'un metohod dans mon dépôt:

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

Avez-vous lire la documentation? La langue est nommée HQL (ou JPQL). Pas Hibernate SQL. Lisez https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#hql et essayez quelque chose. Votre requête est assez simple à écrire, si vous prenez le temps de lire la documentation et les exemples, et essayez des choses. –

Répondre

1

try this: (retourne des objets OrderEntity complets)

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

si vous avez besoin chercher toutes les données pour hâte produits utiliser: .... OrderEntity o rejoindre o.products ... dans la requête au lieu de OrderEntity o rejoindre o.products

1

Ceci est une projection composée de colonnes de nombreux entties, donc vous devez aller à la stratégie de classe Résultat.

Fondamentalement, vous créez une classe POJO avec le résultat attendu fields Un un constructeur équivalent:

public class ResultClass{ 

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

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

Ensuite, vous modifiez la requête un peu:

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'; 

Et changer le type de retour sur l'interface méthode:

@Repository 
public interface OrderRepository extends JpaRepository<OrderEntity, Long> { 
    @Query("...") 
    List<ResultClass> findAllByProductName(@Param("name") String name); 
} 
+0

Je n'ai pas compris. Je demande une requête pour obtenir toutes les commandes où le nom du produit est égal à la valeur voulue. – user

+0

Mmm ... ok dans ce cas, c'est trop trivial d'une réponse de toute façon .. s'il vous plaît lire la documentation comme @JB Nizet a souligné. Mais à la fin si vous voulez obtenir des colonnes de plusieurs tables comme dans votre question .. alors j'espère que mon poste serait utile –

+0

Cette réponse est fausse de toute façon. Vous utilisez toujours une requête SQL, et pas une requête JPQL. –