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. Edraw安装图解

    Edraw安装图解   Success

  2. SDL检查

    在用 Visual Studio 编译比较早的代码时,经常会遇到错误: 错误 C4996 'wcscpy': This function or variable may be unsafe. Cons ...

  3. jsp config设置jsp页面

    jsp-config jsp-config功能:用于设定jsp页面的相关设置(web.xml 版本在2.4之后) 常用的设置包括 taglib和jsp-property-group两个子元素.其中ta ...

  4. 手机端的META你知道多少

    一.天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...

  5. ArcEngine 9.3与64位操作系统 冲突

    ArcEngine 9.3与64位操作系统 冲突 2011年03月30日 星期三 11:13 错误信息: 未处理 System.TypeInitializationException  Message ...

  6. Python获取路径下所有文件名

    python 获取当前文件夹下所有文件名   os 模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os 4 ...

  7. SQL语句执行过程详解

    一.SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行select语句时, 客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句.也就是说,Oracle客户 ...

  8. define 常量的定义和读取

    define(‘常量’,‘常量值’)----------------------define来定义常量, echo 也能输出常量, get_defined_constants(true)------- ...

  9. ReactNative——UI1.登录界面样式设置

    使用React 基本组件结合flex 属性,实现简单登录布局UI 效果 效果预览:

  10. Vue CLI 3 配置兼容IE10

    最近做了一个基于Vue的项目,需要兼容IE浏览器,目前实现了打包后可以在IE10以上运行,但是还不支持在运行时兼容IE10及以上. 安装依赖 yarn add --dev @babel/polyfil ...