Hibernate hql 查询常见问题(一)
以前公司都是在用Mybatis的,在这初用Hibernate,有很多地方还没有琢磨透
今天利用hql查询的时候,真的是屡经坎坷
之前先是封装了一个使用hql查询并返回List的方法findByHql,目的是借助这个方法进行查询
@Override
public <T> List<T> findByHql(String hql, Object... param) {
Query q = getSession().createQuery(hql);
if ((param != null) && (param.length > 0)) {
for (int i = 0; i < param.length; i++) {
q.setParameter(i, param[i]);
}
}
return q.list();
}
最初的代码
//只有评价项目分类等级(一级分类:0)的评价项目才会在评价项管理页面显示
List<TAssessItemEntity> assessItemList = systemService.findHql("from T_Assess_Item Where assessitemParentid =: assessitemParentid", ASSESS_ITEM_FIRST_LEVEL);
①,然后抛出了一个异常,T_Assess_Item没有被映射
org.hibernate.hql.internal.ast.QuerySyntaxException: T_Assess_Item is not mapped [from T_Assess_Item Where assessitemParentid =:assessitemParentid ]
查完之后才明白,有HQL进行查询的时候,from后边要跟的不是数据库的表名,而是实体类的类名
修改代码:
//只有评价项目分类等级(一级分类:0)的评价项目才会在评价项管理页面显示
List<TAssessItemEntity> assessItemList = systemService.findHql("from TAssessItemEntity Where assessitemParentid =: assessitemParentid", ASSESS_ITEM_FIRST_LEVEL);
②,然后又报了一个错,参数前缀冒号后边不允许有空格
org.hibernate.QueryException: Space is not allowed after parameter prefix ':' [from TAssessItemEntity Where assessitemParentid =: assessitemParentid]
把空格删掉,然后牢记:参数前缀":"后不允许有空格
修改代码:
//只有评价项目分类等级(一级分类:0)的评价项目才会在评价项管理页面显示
List<TAssessItemEntity> assessItemList = systemService.findHql("from TAssessItemEntity Where assessitemParentid =:assessitemParentid", ASSESS_ITEM_FIRST_LEVEL);
③,再次报错,位置超过了声明参数的个数
org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1
然后去debug,发现出错是在findByHql方法的 q.setParameter(i, param[i]); 这一行
继续逐层查看源代码调试,发现Hibernate中常用的setParameter方法有两个,分别是
public Query org.hibernate.internal.AbstractQueryImpl.setParameter(int position, Object val) throws HibernateException
public Query org.hibernate.internal.AbstractQueryImpl.setParameter(String name, Object val) throws HibernateException
两个方法传递的参数不一样,分别是参数位置和参数名,而我封装调用的findByHql方法使用的是第一个,通过传递参数位置和参数值的方式设置参数。
然后上网查阅和自己尝试,发现将Hql改为为:"from TAssessItemEntity Where assessitemParentid =?"时,程序可以正常运行。
所以可以认为
(Ⅰ)Hql为:"from TAssessItemEntity Where assessitemParentid =:assessitemParentid"时,尽量通过调用q.setParameter("assessitemParentid", param[i])设置参数。
(Ⅱ),Hql为:"from TAssessItemEntity Where assessitemParentid =?"时,可以调用q.setParameter(0, param[i])时设置参数。
推荐阅读
-
oracle数据库查询没问题,正常显示两个汉字;但是java后台Hibernate查询的时候只显示第一个汉字怎么解决?
-
hibernate多表查询中单表的同一条记录内存共享时弊病的处理
-
hibernate多表查询中单表的同一条记录内存共享时弊病的处理
-
Hibernate 超简单的一对多和多对一查询
-
测试Hibernate添加查询修改删除学生信息(一对多的关系)
-
Hibernate 的HQL,QBC 查询语言
-
hibernate框架学习笔记10:HQL查询详解
-
Hibernate通过SQL查询常量时只返回第一个字符问题的解决方法
-
Hibernate的查询 HQL查询 参数,分页,分组
-
Hibernate的查询 HQL查询 查询某几列