http://blog.sina.com.cn/s/blog_8acd9e4b0102uwev.html

Hibernate对substring和cast的支持问题

问题:要比较日期的范围。。。这是只取MM-dd格式的日期,而数据库中记录的当然是最详细的yyyy-MM-dd的格式。这使用SQL很简单,substring(convert(varchar(10),birthday,120),6,5)

但是放到HQL中就出问题了。。。。

hibernate竟然把它截为了substring(convert(varchar(10),birthday,120))。。。。。然后执行的时候SQL就报错,说substring需要三个参数,我晕阿,后来多处查找问题,竟然无人提到过相关的内容。。。但是hibernate明明支持substring的方法的,在单独处理字符串字段的时候一直都是可以的,后来仔细考虑了下,估计hibernate在处理substring+convert的时候可能处理不好,因为两个都是3个参数的方法,估计hibernate把convert里面的两个参数当作substring的了,于是出了问题,这应该是hibernate的一个bug。

于是后来想用cast+month的方法:

cast(month(birthday) as varchar)。。。结果发现hibernate对cast支持也有问题,竟然报错。。。多处找了下资料,才明白原来hibernate对cast的支持是特别处理的,cast(arg1 as arg2)中arg2的转换类型应该是hibernate类型,而不是数据库中的类型,,我晕倒。。把varchar换成string后就好了,不过发现依然不对。。1月份的话,出来的就是1,不是01。。这样无法对+0的日期格式比较,结果想到了另外两个方法。。。把月份+日期处理成浮点。。月份.日期。。。01-11处理成1.11,11-09处理成11.09,这样就可以比较了,不过比较麻烦。。。但至少问题解决。

后来又想到了另一个方法:

把记录中用户生日的年份取出来,添加到参数的前面,这样convert(varchar(10),birthday,120) >= cast(year(birthday) as string)+'-'+'11-01',这种方法也可以,而且比上面的处理方法简单。。。

再后来想到了一个在hibernate中使用substring+convert的方法,就是对表对象po添加一个新属性,shortbirthday,并在配置文件中如下定义:

substring(convert(varchar(10),dbirthday,120),6,5)

这样就可以在hql中直接使用shortbirthday属性来与参数比较了。。而且hibernate对此是支持的。。。那当然这个又比上面的方法简单了,但是唯一的问题就是,每次查询用户的时候,hibernate都会自动把这个属性查出来,这就影响了查询性能,我只有在查询用户生日的时候才会用到这个属性阿。。。这个让人比较头大,但应该不会影响太大,不过对于要求比较高的我来说。。我不会让这种问题发生的。。。所以我宁愿选择上面的那种方法,虽然稍微麻烦了点,但是不会对别的查询产生影响。

最后,在我以为找到了最佳解决方法的时候,另一个同事找到了一个更好的方法,是目前为止我觉得最好的方法,而且我也觉得应该是这个问题解决得最佳方法,就是灵活运用sql的convert。。。

其实之前我们就一直在考虑如何使用一个sql函数来得到月份+日期的方法,当时大家都被yyyy-MM-dd的格式限定,所以都没有想到,以为是没有办法的,而事实上covert的强大足以解决该问题了。。。

熟悉convert的应该都知道convert的第一个参数的长度也就是决定最终截取格式的长度,并且是从第一个位置开始截取的。。那么我们一直都在convert第三个参数120中考虑问题,从没有想到过别的参数能够直接显示月份+日期的,而事实上它是有参数提供位MM-dd-yyyy格式的。。那么我们利用第一参数的长度和第三个参数的格式就能够得到我们最终需要的月份+日期的格式了。。。这也就避免了hibernate中HQL的尴尬。。。

详细如下:

CONVERT(char(5), GETDATE(), 110)

Hibernate对substring和cast的支持问题的更多相关文章

  1. native生成策略:由Hibernate根据所使用的数据库支持能力从identity、sequence或者等生成策略中选择一种

    increment生成策略:当Hibernate准备在数据库表中插入一条新记录时,首先从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值.这种策略即incr ...

  2. HQL查询及Hibernate对c3p0连接池的支持

    //HQL查询 // auto-import要设置true,如果是false,写HQL时要指定类的全名 //查询全部列 Query query = session.createQuery(" ...

  3. hibernate对连接池的支持和HQL查询

    hibernate对连接池的支持 连接池, 作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! 只维护一个连 ...

  4. [转载]Hibernate如何提升数据库查询的性能

    目录(?)[-] 数据库查询性能的提升也是涉及到开发中的各个阶段在开发中选用正确的查询方法无疑是最基础也最简单的 SQL语句的优化 使用正确的查询方法 使用正确的抓取策略 Hibernate的性能优化 ...

  5. Java框架之Hibernate(二)

    本文主要介绍: 1 Criteria 接口 2 用 myeclipse 反向生成 3 hibernate  主键生成策略 4 多对一 5 一对多 6 使用List 集合的一对多 7 多对多 一.Cri ...

  6. SSH面试题(struts2+Spring+hibernate)

    struts2 + Spring +hibernate Hibernate工作原理及为什么要用?   原理:   1.读取并解析配置文件   2.读取并解析映射信息,创建SessionFactory ...

  7. Hibernate ——二级缓存

    一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...

  8. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

  9. hibernate UUID问题

    前言:hibernate对于字符串类型主键支持UUID主键生成策略,(号称是世界上唯一的字符串) 运行环境:运行环境:hibernate5.2,mysql5.6 一,使用hibernate给Strin ...

随机推荐

  1. laravel中的DB facade实现数据的CURD

    /* $students=DB::select("select * from student"); var_dump($students);*/ //新增数据: /*$bool=D ...

  2. Installing MIB in Ubuntu and Solving the Error “SNMP Cannot Find Module …”

    Has noticed an error after executing the command snmpwalk with the indication of MIB instead of OID: ...

  3. java.util.logging

    我们目前记录日志用的最多的就是Apache的log4j,其实java.util本身也提供日志记录功能,即java.util.logging,值得关注的就是它的等级与log4j的等级有所不同: 首先我们 ...

  4. js 兼容各类手机 的写法 待续

    //通过高度来判断是否是iPhone 4还是iPhone 5 isPhone4inches = (window.screen.height==480); isPhone5inches = (windo ...

  5. Java中线程同步的方法

    同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注 ...

  6. 强化学习 平台 openAI 的 gym 安装 (Ubuntu环境下如何安装Python的gym模块)

    openAI 公司给出了一个集成较多环境的强化学习平台  gym , 本篇博客主要是讲它怎么安装. openAI公司的主页: https://www.openai.com/systems/ 从主页上我 ...

  7. 使用git错误日志

    错误日志 pull错误 将远程仓库内容pull下来的过程中,碰到了拒绝合并两个不相关的历史,所以无法下载,同样的也无法push 但是我的东西明明是从组织里克隆下来的,只是做了一些修改 后来我我尝试不替 ...

  8. ElasticSearch—分页查询

    ElasticSearch查询—分页查询详解 Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...

  9. hdu1257 dp(最长上升子序列)

    题意:有一种拦截系统,可以打击导弹,但是打击的高度会逐渐下降,因此为了防御导弹攻击,就必须用多个系统,现给出一列导弹依次的高度,求最少需要的系统数. 这道题是最长上升子序列问题,但是我一开始其实并没有 ...

  10. gtx860M,cuda9路1080p多高斯运动检测测试

    多高斯背景差分,非常吃cpu,特别是多路视屏,所以想用gpu做检测 后面的跟踪一系列的规则判断用cpu opencv+cuda+stl做了个测试 代码: // MTTestCudaMog.cpp : ...