`

Hibernate对substring和cast的支持问题

    博客分类:
  • Java
阅读更多

 这次徒弟又遇到了hibernate的问题。。。。。。

要比较用户的生日。。。这是只取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,并在配置文件中如下定义:

<property name="shortbirthday" type="string" insert="false" update="false" length="5">
         <formula>substring(convert(varchar(10),dbirthday,120),6,5)</formula>
        </property>

这样就可以在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)

这里的110换成5也可以,详细地convert的参数可以参考本blog的前一篇文章

0
0
分享到:
评论

相关推荐

    数据库中的substring

    - **编码问题**:不同的数据库系统对字符编码的处理可能不同,需确保在多语言环境下正确处理。 - **性能优化**:频繁使用`substring`可能导致性能下降,尽量在设计数据库结构时避免过多的字符串操作。 `substring`...

    Arduino项目开发 Strings_StringSubstring_StringSubstring.pdf

    在Arduino项目开发中,字符串操作是非常常见的一种任务。`String`类是Arduino库提供的一种用于处理文本数据的数据类型,它...通过实践和不断探索,你可以更好地利用`String`类和`substring()`方法来解决复杂的问题。

    Hibernate 函数 ,子查询 和原生SQL查询

    1. **Hibernate的数学函数**:如`max()`, `min()`, `sum()`, `avg()`和`count()`,它们用于对数据进行聚合操作,例如找出最大值、最小值、总和或平均值。 2. **字符串函数**:如`concat()`, `lower()`, `upper()`和...

    数据结构问题:“最长回文子串问题”(Longest Palindromic Substring),详细解法和代码实现

    数据结构问题:“最长回文子串问题”(Longest Palindromic Substring),详细解法和代码实现; 数据结构问题:“最长回文子串问题”(Longest Palindromic Substring),详细解法和代码实现; 数据结构问题:“最长...

    JavaScript 和.NET 中substr() 和 substring() 方法的区别

    本文将深入探讨JavaScript中的`substr()`和`.NET`中的`substring()`方法,以及它们之间的区别。 ### JavaScript中的`substr()`方法 在JavaScript中,`substr()`方法用于提取字符串中的一部分。它接受两个参数:...

    Hibernate-HQL-查询-Query资料

    - 支持数学函数(如SUM、AVG、COUNT、MAX、MIN)和字符串函数(如UPPER、LOWER、SUBSTRING)。 - 使用AS进行别名定义,提高代码可读性。 - 支持集合操作,如IN、MEMBER OF等。 6. **关联查询** - 可以直接在HQL...

    js字符串截取函数slice、substring和substr的比较_.docx

    JavaScript 字符串截取函数 slice、substring 和 substr 的比较 在 JavaScript 中,字符串截取函数有三种常用的方法:slice()、substring() 和 substr()。这三种方法都可以用来截取字符串,并返回截取的结果,但是...

    sqlserver substring函数使用方法小结

    在操作sqlserver时候用到了substring函数 SUBSTRING ( expression, start, length ) 参数 expression 字符串、二进制字符串、文本、图像、列或包含列的表达式。请勿使用包含聚合函数的表达式。 start 整数或可以隐式...

    Substring字符串截取-kaic

    首先,`substring`方法的基本语法是`substring(startIndex, endIndex)`,它接受两个参数,`startIndex`和`endIndex`,用于指定子字符串的起始位置和结束位置。这两个位置都是基于0索引的,即字符串的第一个字符位置...

    hibernate 自动导入 sql 文件 import.sql 国际化编码的问题的解决方案

    ### Hibernate自动导入SQL文件import.sql国际化编码问题的解决方案 #### 背景介绍 在使用Hibernate框架时,经常需要在项目启动初期或者数据库更新时自动执行一些SQL脚本(如DDL脚本)来创建或更新数据库结构。这些...

    substring用法简介

    substring用法简介

    在js中,截取字符串的slice和substring的区别

    3. **兼容性问题**:虽然现代浏览器都支持这两种方法,但在某些较旧版本的浏览器中,`substring` 的兼容性可能会更好一些。 #### 4. 结论 在选择使用 `slice` 还是 `substring` 时,应根据具体的需求和上下文环境来...

    js中substring和substr两者区别和使用方法.docx

    JavaScript 中的 substring 和 substr 区别与使用方法 在 JavaScript 中,substring 和 substr 是两个常用的字符串截取方法,但是它们之间存在着一些区别和使用方法的不同。本文将详细介绍 JavaScript 中 substring...

    js中substring和substr的定义和用法.docx

    在兼容性方面,`substring`和`substr`在大多数现代浏览器中都得到了良好支持。然而,在处理负数参数或未指定第二个参数时,可能需要额外注意不同浏览器的行为差异。 总结一下,`substring`和`substr`都是用来从...

    String 截取字符串方法subString()

    这种形式的`substring`方法允许指定开始和结束的索引,它会截取从`beginIndex`(包含)到`endIndex`(不包含)之间的字符。例如,`s.substring(0, 4)`将截取从下标0(即字符'1')到下标4(不包括'4')的字符,结果...

    【SUBSTRING_INDEX】MySQL官方示例

    `SUBSTRING_INDEX()` 是 MySQL 数据库中的一个常用字符串处理函数,主要用于根据指定的分隔符对字符串进行分割,并返回分割后的子字符串。此函数在处理 URL 或路径等类型的数据时非常有用。 #### 二、函数语法 ```...

    oracle中 substring函数的使用

    ### Oracle中的SUBSTR函数详解 在Oracle数据库中,`SUBSTR`函数是一个非常重要的字符串处理函数,用于从指定的字符串中提取子串。...熟练掌握`SUBSTR`函数的使用对于提高SQL查询效率和数据处理能力具有重要意义。

    substring应用

    怎样使用Substring的应用以及对他的用法方法有更深的了解

    hibernate String struts2 包

    `String`类提供了许多方法,如`substring`、`indexOf`、`concat`等,方便对字符串进行操作。在开发过程中,理解并熟练使用`String`类是每个Java程序员的基础技能。 **Struts2** 是一个基于MVC(Model-View-...

    js字符串截取函数slice、substring和substr的比较

    本文将对JavaScript字符串截取的三个主要函数slice()、substring()和substr()进行详细的比较和分析,以帮助开发者更好地理解和掌握它们在实际编程中的应用。 首先,我们来看slice()函数。slice()函数用于从已有的...

Global site tag (gtag.js) - Google Analytics