【问题标题】:HQL many to many queryHQL 多对多查询
【发布时间】:2016-03-29 19:53:29
【问题描述】:

我有两个具有多对多关系的表。 products(id, description, price,image)----> products_category(idProducts, category_id)----> category(id, category_name).

这是我的实体:

1.产品

@Entity
@Table(name = "products")
public class Products implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "idProducts")
    private long id;

    @Column(name = "description")
    private String description;

    @Column(name = "price")
    private String price;

    @Column(name = "image")
    private byte [] image;

    public Products() {
    }

    public Products(String description, String price, byte[] image) {}


    @ManyToMany
    @JoinTable(
       name = "category_products",
            joinColumns ={@JoinColumn (name = "Products_idProducts", referencedColumnName = "idProducts")},
            inverseJoinColumns = {@JoinColumn(name = "category_id", referencedColumnName = "id")}
    )
        List<Category> categories = new ArrayList<>();

    @ManyToMany
    @JoinTable(
            name = "users_product",
            joinColumns ={@JoinColumn (name = "Products_idProducts", referencedColumnName = "idProducts")},
            inverseJoinColumns = {@JoinColumn(name = "users_id", referencedColumnName = "id")}
    )
      List<Users> usersList = new ArrayList<>();

2.类别

@Entity
@Table(name = "category")
public class Category {
    @Id
    @Column(name = "id")
    private long id;

    public Category() {
    }

    public Category(String category_name) {
        this.category_name = category_name;
    }

    @Column (name = "category_name")
    private String category_name;

    @ManyToMany(mappedBy = "categories")
    private List<Products> products = new ArrayList<>();

我正在尝试为控制器编写查询,它通过先前选择的带有 id 的类别对象返回所有产品?我尝试了很多查询,但都抛出异常。

public List<Products> list (Category category) {
         //category - object with needed id
        Query query;
            query = entityManager.createQuery("SELECT c FROM Category c  left join c.categories WHERE c.category = :category", Products.class);
            query.setParameter("category", category);

        return (List<Products>) query.getResultList();
    }

java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: categories of: classes.Category [SELECT c FROM classes.Category c join c.categories WHERE c.category = :category]
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)

【问题讨论】:

    标签: java database hibernate hql


    【解决方案1】:

    如果你需要检索产品,你需要查询select Product entity,而不是Category。

    所以:

    通过先前选择的类别对象返回所有产品 身份证

    你需要做的:

    Query query = entityManager.createQuery("SELECT p FROM Product p 
        JOIN p.categories c 
        WHERE c.id = :idCategory");
    query.setParameter("idCategory", category.getId());
    

    您使用LEFT JOIN,但在您的情况下这不是必需的,因为您查询的唯一条件是找到具有特定 ID 的类别。此条件将忽略JOINLEFT 部分,始终强制为JOIN

    【讨论】:

      【解决方案2】:

      我认为你的代码有一些错误:

      1. SELECT c表示Category,但你将结果列表转换为List&lt;Product&gt;,应该是SELECT c.products

      2. 您的 WHERE c.category = :category 子句不正确,因为您的 Category 类中没有任何 category 属性,应该是 WHERE c.id = :idquery.setParameter("id", category.getId());

      希望有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-01-26
        • 2011-08-21
        • 2010-11-13
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多