2016-03-29 4 views
1

У меня есть две таблицы со многими и многими отношениями. продукты (id, описание, цена, изображения) ----> products_category (idProducts, категория _id) ----> категория (id, category_name).HQL для многих запросов

Вот мои enteties:

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.Category

@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<>(); 

Я пытаюсь написать запрос для контроллера, который возвращать все продукты по предварительно отобранному объекту категории с идентификатором? Я попробовал много запросов, но все выдает исключения.

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) 

ответ

1

Если вам нужно получить продукты, вам необходимо сделать запрос, который select Продукт, а не Категория.

Итак:

возвратные все продукты previosly выбранной категории объекта с идентификатором

Вам нужно сделать:

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

Вы используете LEFT JOIN, но это не является необходимым в вашем случае, поскольку уникальное условие вашего запроса - это поиск категории с определенным идентификатором. Это условие будет игнорировать LEFT часть JOIN, заставляя всегда JOIN.

+0

Yeap, спасибо. – user202822

1

Я думаю, что есть некоторые ошибки в коде:

  1. вас SELECT c, которые означают Category, но вы приводите список результатов к List<Product>, должно быть SELECT c.products

  2. Вашего пункт WHERE c.category = :category является Неправильно, потому что у вас нет атрибута category в вашем классе категории, должно быть WHERE c.id = :id и query.setParameter("id", category.getId());

Надеюсь, что помогите.

Смежные вопросы