2017-07-03 76 views
2

我的產品的實體看起來象下面這樣:的Hibernate查詢到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<>(); 
} 

我想獲得的所有訂單,其中產品名稱等於需要的值。並且我編寫sql查詢以從數據庫中獲取結果,但我無法爲Spring Data JPA編寫hibernate查詢。

我的PostgreSQL的查詢看起來是這樣的:

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

而這個查詢返回我命令,PRODUCT_ID和產品名稱的標識。這工作。但我不知道如何使用@Query將這個問題寫成spring query。

我需要一個metohod在我的倉庫:

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

有你閱讀文檔?該語言被命名爲HQL(或JPQL)。不是Hibernate SQL。閱讀https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#hql並嘗試一些。如果您花時間閱讀文檔和示例並嘗試一下,那麼您的查詢寫起來非常簡單。 –

回答

1

試試這個:(它返回完整的OrderEntity對象)

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

,如果你需要急於獲取產品的所有數據使用:.... OrderEntityØ加入o.products ...查詢,而不是OrderEntityØ加入o.products

1

這是許多entties由列的投影,所以你不得不去的結果類的策略。

基本上,你創建一個POJO類與預期結果的字段的等效構造:

public class ResultClass{ 

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

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

然後你改變查詢了一下:

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

,並更改界面上的返回類型方法:

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

我不明白。我要求查詢獲取產品名稱等於所需價值的所有訂單。 – user

+0

嗯......在這種情況下,這確實太無關緊要了......請閱讀@JB Nizet指出的文檔。但最後如果你想要從多個表中獲得列,就像你的問題那麼希望我的帖子能派上用場 –

+0

這個答案無論如何都是錯誤的。您仍在使用SQL查詢,而不是JPQL。 –