Hibernate HQL查询时 条件字段没有被反射成数据库表字段


业务场景非常简单:
采用hibernate hql查询数据库。

ps:为了隐私起见,关键类,表明用xxx代替,还请见谅
下面是dao层方法:


 String queryString="from XXXX  where bizSN=:bizsn";
            Query query=this.getSession().createQuery(queryString);
            query.setParameter("bizsn", audit.getBizSn());

            List<CAAuditAuthentication> list=query.list();

在执行查询时报错:


 Hibernate: select caauditaut0_.id as id1_0_, caauditaut0_.biz_sn as biz2_0_, caauditaut0_.call_back_time as call3_0_, caauditaut0_.create_time as create4_0_, caauditaut0_.photo_negative as photo5_0_, caauditaut0_.photo_postive as photo6_0_, caauditaut0_.push_notifaction as push7_0_, caauditaut0_.result_code as result8_0_, caauditaut0_.result_info as result9_0_, caauditaut0_.status as status10_0_, caauditaut0_.time_consumer as time11_0_ from xxxxx  caauditaut0_ where bizSN=?
2015-10-25 23:20:53 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper]-[WARN] SQL Error: 1054, SQLState: 42S22
2015-10-25 23:20:53 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper]-[ERROR] Unknown column 'bizSN' in 'where clause'
2015-10-25 23:20:53 [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl]-[INFO] HHH000106: Forcing container resource cleanup on transaction completion

从错误信息可以清除的看见,条件字段bizSN在被转换成sql语句的时候,仍然是bizSN并没有被映射成数据库的字段(biz_sn),但是表明和其他返回字段又被成功转换了。

下面是bo


 private String bizSN; // 流水号

    @Column(name = "biz_sn")
    public String getBizSn() {
        return bizSN;
    }

    public void setBizSn(String bizSN) {
        this.bizSN = bizSN;
    }

下面是表:
图片描述

下面是我的一些想法:


 1.之前以为是注解的表字段写错了,然后检查了一遍发现并没有问题,且之前执行保存操作的时候,是成功入库的,所以这里可以排除注解的错误
2.我这边将查询条件部分写成数据库字段,如:from XXXX  where biz_sn=:bizsn,是ok的,感觉有些混乱。 hql查询,出现了,hql的语法和sql的语法混合。
3.是所有的字段作为查询条件都是这种情况,我在想是不是配置出了什么问题。或者hibernate有什么配置可以屏蔽在查询的时候不将查询条件转换成数据库字段而是采用hql查询语句中的原字符串。

还请有相关经验的大神赐教,如果觉得问的有些小白还请见谅

hibernate java 数据库 hql

糟糕这翔里有毒 9 years, 5 months ago

问题已经解决,是bo的属性名命名不规范,必须要严格按照hql的规则来,首字母小写,其他单词首字母大写,表中字段有下划线的,视为第二个单词如:bizSn,因为hql是根据get方法来获取的。

kevingv answered 9 years, 5 months ago

Your Answer