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])时设置参数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值