HQL多对多查询
HQL many to many query
我有两个具有多对多关系的表。
产品(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.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<>();
我正在尝试为控制器编写查询,其中 return 所有产品都按先前选择的具有 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)
我认为您的代码中存在一些错误:
你SELECT c
意思是Category
但是你把结果列表投到List<Product>
,应该是SELECT c.products
您的 WHERE c.category = :category
子句不正确,因为您的类别 class 中没有任何 category
属性,应该是 WHERE c.id = :id
并且query.setParameter("id", category.getId());
希望有所帮助。
如果您需要检索产品,您需要查询 select
产品实体,而不是类别。
所以:
return all the products by previosly selected category object with
id
您需要做的:
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 的类别。此条件将忽略 JOIN
的 LEFT
部分,始终强制 JOIN
.
我有两个具有多对多关系的表。 产品(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.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<>();
我正在尝试为控制器编写查询,其中 return 所有产品都按先前选择的具有 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)
我认为您的代码中存在一些错误:
你
SELECT c
意思是Category
但是你把结果列表投到List<Product>
,应该是SELECT c.products
您的
WHERE c.category = :category
子句不正确,因为您的类别 class 中没有任何category
属性,应该是WHERE c.id = :id
并且query.setParameter("id", category.getId());
希望有所帮助。
如果您需要检索产品,您需要查询 select
产品实体,而不是类别。
所以:
return all the products by previosly selected category object with id
您需要做的:
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 的类别。此条件将忽略 JOIN
的 LEFT
部分,始终强制 JOIN
.