auto-import导致HQL的错误

来源:互联网 发布:小学老师 知乎 编辑:程序博客网 时间:2024/06/08 17:15

因为之前没怎么用过hibernate,第一次正儿八经地用,被一个HQL的错误折腾得够呛。


我的hql大致如下:

"from OrderDetail where accountID=:accountID and orderID=:orderID"

但是执行的时候总是报错,说是OrderDetail is not mapped,开始怀疑是我的hibernate配置文件出了问题,改了几次都不见效,后来用同样的配置文件往database里面insert一条记录成功了。那说明配置文件没错,问题就在hql的写法了。


于是:

加上as,"from OrderDetail as detail where detail.accountID=:accountID and detail.orderID=:orderID",没用看来不是这个问题。


后来google一下,发现大部分人提到可能的两个原因。第一是from后面不能是table名,应该是class name,而且是大小写敏感的,这个我没有设置错。第二个,是可以在hibernate配置文件中显示指定一下“hibernate.query.factory_class”属性。这个我开始没有设置,于是把它置为Hibernate3.0的查询翻译器org.hibernate.hql.ast.ASTQueryTranslatorFactory,问题依旧。再试Hibernate2.1的查询翻译器org.hibernate.hql.classic.ClassicQueryTranslatorFactory,也不行,错误提示倒是不一样了。

折腾了半天,后来想是不是得用class的full name,试了一下,将hql改成"from myPackage.OrderDetail where accountID=:accountID and orderID=:orderID",并且把show_sql打开,试了一下,还是不行,把打出来的sql拿出来一看,好像是where字句中的属性没有替换成数据库字段。最后没有办法,加上as,成功了。

"from myPackage.OrderDetail as detail where detail.accountID=:accountID and detail.orderID=:orderID"


后来一琢磨,想到底是什么原因导致需要class的packaged name呢?原来是这auto-import在捣鬼,因为在配置文件中auto-import被设为了false。晕。