Hibernate对substring和cast的支持问题
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的支持问题的更多相关文章
- native生成策略:由Hibernate根据所使用的数据库支持能力从identity、sequence或者等生成策略中选择一种
increment生成策略:当Hibernate准备在数据库表中插入一条新记录时,首先从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值.这种策略即incr ...
- HQL查询及Hibernate对c3p0连接池的支持
//HQL查询 // auto-import要设置true,如果是false,写HQL时要指定类的全名 //查询全部列 Query query = session.createQuery(" ...
- hibernate对连接池的支持和HQL查询
hibernate对连接池的支持 连接池, 作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! 只维护一个连 ...
- [转载]Hibernate如何提升数据库查询的性能
目录(?)[-] 数据库查询性能的提升也是涉及到开发中的各个阶段在开发中选用正确的查询方法无疑是最基础也最简单的 SQL语句的优化 使用正确的查询方法 使用正确的抓取策略 Hibernate的性能优化 ...
- Java框架之Hibernate(二)
本文主要介绍: 1 Criteria 接口 2 用 myeclipse 反向生成 3 hibernate 主键生成策略 4 多对一 5 一对多 6 使用List 集合的一对多 7 多对多 一.Cri ...
- SSH面试题(struts2+Spring+hibernate)
struts2 + Spring +hibernate Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory ...
- Hibernate ——二级缓存
一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...
- Spring 4支持的Java 8新特性一览
有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...
- hibernate UUID问题
前言:hibernate对于字符串类型主键支持UUID主键生成策略,(号称是世界上唯一的字符串) 运行环境:运行环境:hibernate5.2,mysql5.6 一,使用hibernate给Strin ...
随机推荐
- UVALive 4764 dp
DES: 这是一个新的游戏.给你一套牌.编号从1到100000.正常来说.你手中的牌和这次翻的牌是一样的,就会加一分.但是.如果是999的话.加三分.所以问你最大的分是多少. 貌似是简单的DP吧.(D ...
- VPNl连接
2服务器IP端口及密码在QQ邮箱 OS Reload on localhost.localdomain [95.169.18.222] SSH port: 29657 69.194.13.216 ...
- TClientDataSet 的Filename 和 open方法
cdsAdd.Open 不能用open,因为这个是DataSet的通用方法,不会检测文件名的,文件名是CDS特有的
- Spring学习笔记之The IoC container
IoC is also known as dependency injection (DI). 这是一个过程?什么样的过程呢?对象自己定义它的依赖关系,这意味着,那些他们依赖的对象,只能通过构造函数参 ...
- SharePoint Visio Graphics Service-PowerShell
1. 配置托管服务账户 Set-SPVisioExternalData -VisioServiceApplication "Visio Graphics Service" –Una ...
- anu - component
import { extend, isFn, options, clearArray, noop } from "./util"; import { CurrentOwner } ...
- screen 命令 http://man.linuxde.net/screen
http://man.linuxde.net/screen -A 将所有的视窗都调整为目前终端机的大小. -d <作业名称> 将指定的screen作业离线. -h <行数> 指 ...
- NBUT 1219 Time 2010辽宁省赛
Time limit 1000 ms Memory limit 131072 kB Digital clock use 4 digits to express time, each digit ...
- UI基础:UI中类的继承关系图,最基本的视图分析
首先,UI中常用的UIwindow.UILabel.UIButton.UITextField属于UIView的子类.UITextField和UILabel和UIwindow自身没有初始化方法,需要使用 ...
- 蓝桥杯 BASIC-9:特殊回文数
基础练习 特殊回文数 时间限制:1.0s 内存限制:512.0MB 问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这 ...