1

ブランド

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 からブランド ID を取得したいのですが、エンティティ ブランドで名前付きクエリを作成するにはどうすればよいですか?

これは動作しません:

@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)")
4

2 に答える 2

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 にはテーブルは存在しません。

于 2012-06-03T08:14:41.443 に答える
0

私の知る限り、エンティティクラスでクエリを作成するときは、エンティティの境界から出ることはできません。

代わり.createNativeQuery()に、エンティティ マネージャーのメソッドを使用して、複雑で混合されたクエリを作成します。

于 2012-06-03T08:10:51.483 に答える