Hibernate多对一关联场景下按分类ID查询商品列表的实现问题
HQL查询错误修正方案
你现有代码的核心问题在于HQL语法不符合Hibernate面向实体的查询规则,具体错误点及修正如下:
- 错误1:HQL对实体名大小写敏感,必须和你的实体类名完全一致,你写的
product要改为Product - 错误2:Product实体中没有直接声明
categoryId字段,关联的是category对象,要通过关联属性访问分类ID,即category.categoryId - 错误3:HQL的命名参数前必须加冒号
:标识,你写的WHERE categoryId = categoryId无法被识别为参数匹配,需要改为WHERE category.categoryId = :categoryId - 错误4:入参
categoryId是int类型,调用setLong类型不匹配,改为setParameter即可自动适配类型
修正后的代码如下:
@Override public List<Product> getListByCategory(int categoryId) { Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("FROM Product WHERE category.categoryId = :categoryId"); query.setParameter("categoryId", categoryId); List<Product> list = query.list(); return list; }
也可以通过直接匹配关联实体的方式实现,写法更直观:
@Override public List<Product> getListByCategory(int categoryId) { Session session = sessionFactory.getCurrentSession(); Category category = session.get(Category.class, categoryId); Query query = session.createQuery("FROM Product WHERE category = :category"); query.setParameter("category", category); return query.list(); }
内容的提问来源于stack exchange,提问作者Kira
相关产品推荐
相关产品推荐

