HQL查询常见问题总结
摘要: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的方式。
阅读更多- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- 网页通不过W3C验证最常见问题总结
- 回溯法搜索总结与常见问题
- MySQL单表查询常见操作实例总结
- svn常见问题,报错,命令及我的总结
- hibernate的hql查询语句总结
- IBM System x3850 M2常见问题总结
- 电脑常见问题总结
- 分库分表的几种常见玩法及如何解决跨库查询等问题
- --------------------Ado.Net读取Excel常见问题总结---------------------------
- 总结了一些指针易出错的常见问题(三)
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re
- 分库分表的几种常见玩法及如何解决跨库查询等问题
- ADO编程常见问题总结
- mybatis collection 一对多关联查询,单边分页的问题总结!
- SQL面试常见问题处理:查询和删除重复记录
- VB高手搜集-常见问题总结(2)
- Java常见乱码问题总结
- 网页Css+Div排版常见问题总结