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

最佳答案

如果我理解正确,则您希望所有品牌都属于一个类别。为什么不简单地使双向关联。然后,您可以执行以下操作:

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中不存在表。

09-11 19:41
查看更多