欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate hql 查询常见问题(一)

程序员文章站 2022-04-13 21:33:24
...

 

以前公司都是在用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])时设置参数。

 

 

相关标签: Hibernate hql