您的位置:首页 > 其它

HQL查询常见问题总结

2018-06-13 15:24 75 查看

摘要:HQL查询,报错

在使用Hibernate进行数据持久化操作的时候,可以减少传统使用JDBC的代码量大,重复枯燥的工作,但是因为Hibernate是处于应用和数据库之间的中间层,所以也有自己的一套逻辑,往往会出现那种一条SQL语句在数据库端可以正常执行并得到结果,但是将其写在Hibernate里之后,就出现了问题。一下是一些常见问题的解答

这里简单列一下常规的HQL操作代码,写一条SQL,然后通过createQuery的方法查询想要的结果。

String sql = "from User where name = 'baowei'";
Query q = session.createQuery(sql);

一、找不到对应的表(table)

这个是很容易犯的一个错误,对于数据库而已表的名称是大小写不敏感的,也就是说User和user实际上时一样的。但是对于Hibernate而言,它是一个ORM框架,是将数据库的表以及视图等和java对象相互关联的一种机制。然而对于Java而言,是大小写敏感的,这个时候例如和数据库user表对应的是User类,那么在写HQL语句的时候对于表的引用就要写成User,而不能是user,否则Hibernate会认为没有这个表,而导致查找失败。


二、excepting open

这里先给出一个SQL语句共大家参考

update User set count = count + 2 where id = 1
这个语句想实现的是将id为1的用户的count字段加2。这个操作在数据库中执行是没有问题的,但是在HQL中就会出现excepting open,found '+'的错误,很多人包括我在内都很惊讶这是很么操作,为什么发现+号也能报错。

如果你一直纠结于这个+号,那么你的问题将无法得到解决,问题的关键是因为count,count是系统的保留字用以计数使用,所以HQL实际上是想打开count()这样的函数,而不是我们所认为的count字段,这个在设计表格的时候也是要格外注意的问题,如果表格中的字段包含有保留字,那么很容易导致你的HQL书写存在问题,而且往往是一些不容易被察觉的问题。

对于上面这个问题,你不妨对于字段信息加上它所对应的表,这样可以让HQL第一时间知道这是字段而不是函数

update User u set u.count = (u.count + 2) where id = 1

三、一些HQL无法操作的数据库SQL

HQL可以看成是对底层SQL的封装,HQL只是将功能“翻译”成了底层的SQL的功能。有些情况下,底层数据库提供的某些功能是HQL所不支持的,这个时候就需要直接使用底层的SQL,Hibernate对此也是有方法支持的。

这个时候使用数据库SQL查询就不能使用Query对象了,而要使用SQLQuery,而对应的方法也变成了createSQLQuery。

String sql = "show variables";    //使用本地的SQL查询所有的变量
SQLQuery q = session.createSQLQuery(sql);
这种SQLQuery的操作跳过了和表绑定的Java对象,所以在使用表名称的时候要使用数据库的表名称。例如数据库的表叫user_info,而对应的可能是User类,这个时候就不要使用User作为表名称了,而要使用user_info。

一般而言就是上述的几种问题,有些问题一般是SQL写的有问题或者是表和对象的不一致所造成的。认真仔细的检查就能发现问题,如果实在有一些在数据库可以执行但是在Hibernate却无法执行的SQL,确实无法排除错误的时候,不妨试试最后一种SQLQuery的方式。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: