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的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值