2015-06-11 23 views
2

我有一些實體產品和類別,它們通過簡單的多對多關係進行連接。我想獲得按單個類別過濾的產品分頁列表。我試圖寫一個Spring Data JPA自動的方法或JPQL查詢方法會產生SQL類似以下內容:JPA - 如何在查詢多對多關係時防止不必要的連接

select [...] FROM ProductToCategory ptc INNER JOIN Product p ON ptc.product_id=p.id WHERE ptc.category_id=? LIMIT ? OFFSET ? 

由於ProductToCategory連接表是不是JPA entity,我不能引用它JPQL,我能想出最接近的事情是:

@Query("SELECT p FROM Category c INNER JOIN c.products p WHERE c=:category") 
Page<Product> findByCategories(@Param("category") Category category, Pageable pageable); 

但由此產生SQL冗餘與分類表連接,並有應用where子句中,而不是在類別在ProductToCategory表中。有沒有辦法做到這一點,而不訴諸於本地SQL

回答

1

我所看到的唯一方法是將實體映射到連接表,並用來自Product和Category的指向此新實體的一對多關係替換多對多產品類別。

這樣的變化實際上是符合Hibernate的最佳做法:

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/best-practices.html

不要使用複雜的關聯映射: 實際測試的情況下真正 許多-to-many關聯很少見。大多數情況下,您需要在「鏈接表」中存儲附加信息 。在這種情況下,使用兩個一對多關聯到一箇中間的 鏈接類更好些,這是 。實際上,大多數關聯是一對多和多對一的關係。 因此,在使用 任何其他關聯風格時,應謹慎行事。