2012-06-03 128 views
1

品牌如何創建manytomany實體的namedquery?

public class Brand implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "BrandID", nullable = false) 
    private Integer brandID; 
    @Basic(optional = false) 
    @Column(name = "BrandName", nullable = false, length = 100) 
    private String brandName; 
    @Basic(optional = false) 
    @Column(name = "Description", nullable = false, length = 1000) 
    private String description; 
    @Column(name = "Is_Visible") 
    private Boolean isVisible; 
    @JoinTable(name = "brandcategory", joinColumns = { 
     @JoinColumn(name = "BrandID", referencedColumnName = "BrandID")}, inverseJoinColumns = { 
     @JoinColumn(name = "CategoryID", referencedColumnName = "CategoryID")}) 
    @ManyToMany(fetch = FetchType.EAGER) 
    private Collection<Category> categoryCollection; 
    @OneToMany(mappedBy = "brand", fetch = FetchType.EAGER) 
    private Collection<Product> productCollection; 

我想以檢索表brandcategory whoes的categoryID =品牌標識:CATEGORYID 我怎樣才能在實體品牌createnamed查詢呢?

這不起作用:

@NamedQuery(name = "Brand.getBrandListByCategory", 
      query = "SELECT b FROM Brand b WHERE b.brandID = 
      (SELECT bc.brandID 
      FROM b.brandctegory bc 
      WHERE bc.category.categoryID = :categoryID)") 
+0

什麼是錯誤信息? – Thor

+0

我沒有得到任何錯誤消息。它解決了:) –

回答

12

如果我理解正確,您需要屬於某個類別的所有品牌。你爲什麼不簡單地使該協會雙向。然後,您可以只執行:

Category category = em.find(Category.class, categoryId); 
return category.getBrands(); 

如果它是單向的,那麼你就需要一個查詢,但它的簡單得多,你嘗試過的一個:

select b from Brand b inner join b.categoryCollection category 
where category.id = :categoryId; 

您的查詢是沒有意義的:它使用一個不存在的關聯(b.brandcategory)。請記住,JPQL使用實體,它們的持久字段和與其他實體的關聯。沒有別的。 JPQL中不存在表。

+0

雅感謝,它的工作。我只是在學習JPA,所以我犯了這個錯誤。 Thannnks。 :) –

0

據我所知,你不能去了實體邊界的,在創建實體類查詢時。

取而代之的是使用實體管理器的.createNativeQuery()方法來創建複雜和混合的查詢。

+1

當然你可以走出一個實體邊界。如果你不能的話,會有什麼聯繫。對於這樣一個簡單的查詢,真的不需要原生查詢。 –

+0

@JBNizet,我不完全是這個領域的專家。所以,請忽略我缺乏的知識。 – Starx