当前位置: 代码迷 >> Java Web开发 >> hql小疑点
  详细解决方案

hql小疑点

热度:10360   发布时间:2013-02-25 21:05:30.0
hql小问题
from Tubualtion t where datediff(yy,t.tbuildtime,getdate())>20
用sql在数据库中测试是成功的,但hql就报语法错误,我用sqlserver数据库,麻烦大神解决一下,谢谢!
引用:
from Tubualtion t where datediff(yy,t.tbuildtime,getdate())>20
用sql在数据库中测试是成功的,但hql就报语法错误,我用sqlserver数据库,麻烦大神解决一下,谢谢!


datediff你看看hql里面有没有这个函数,如果有那我也不知道了。
可能是不识别datediff 函数。

解决办法是需要你写一个类 继承自你对应的hibernate数据库的方言类。

在其构造方法里注册一下你想用的函数
比如: 新建一个类MyDialect 继承自org.hibernate.dialect.MySQL5Dialect

public class MyDialect extends MySQL5Dialect {

public MyDialect(){
super();
                //使用convert_gbk(yourString)来进行字符串排序函数
registerFunction("convert_gbk", new SQLFunctionTemplate(Hibernate.STRING, "convert(?1 using gbk)"));
              
}
}

在项目初始化的时候让hibernate走你设置的MyDialect方言类。
就注册了convert_gbk()这个函数。具体参数你配置好就可以了。
使用方法

String hql = " from Test order by convert_gbk(name) "

列出根据name排序后的全部Test实体
引用:
from Tubualtion t where datediff(yy,t.tbuildtime,getdate())>20
用sql在数据库中测试是成功的,但hql就报语法错误,我用sqlserver数据库,麻烦大神解决一下,谢谢!

你报错发一下吧
我猜应该报错是时间格式的问题。。
数据库里面我最愁的就是时间格式,所以我一般都是以long型存储时间格式的。
引用:
可能是不识别datediff 函数。

解决办法是需要你写一个类 继承自你对应的hibernate数据库的方言类。

在其构造方法里注册一下你想用的函数
比如: 新建一个类MyDialect 继承自org.hibernate.dialect.MySQL5Dialect

Java code?123456789public class MyDialect extends MySQL5D……


http://blog.csdn.net/sd4000784/article/details/7693046
同理:cast 函数也可以注册

registerFunction("cast_mysql", new SQLFunctionTemplate(Hibernate.STRING, "cast(?1 as ?2 )"));


也可以直接注册。
http://hi.baidu.com/xinfeng999/item/603350e10a45bbafce2d4f74

  相关解决方案