Hibernate对substring和cast的支持问题

Spring Data JPA 核心原理与工程实践指南 Spring Data JPA 是 Java 生态中基于 JPA 规范实现的标准化数据访问抽象,其本质是将 ORM(对象关系映射)能力通过 Spring 的 IoC 容器、AOP 事务和约定优于配置思想进行深度封装。它不替代 JDBC,而是在 JPA 实现(如 Hibernate)之上提供面向接口的声明式开发体验,显著降低数据层代码复杂度。技术价值体现在快速迭代支持(如方法名自动解析查询)、事务声明式管理(@Transactional)、以及与 Spring Boot 的无缝集成。典型应用场景包括业务系统 阅读详情

 这次徒弟又遇到了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的前一篇文章

Spring Data JPA核心功能与最佳实践详解 JPA(Java Persistence API)作为Java EE的持久化标准,通过对象关系映射(ORM)技术简化了数据库操作。其核心原理是将Java对象映射到数据库表,自动处理SQL生成和结果集转换。Spring Data JPA在JPA基础上进一步抽象,通过Repository接口自动实现CRUD操作,显著提升开发效率。在微服务架构和云原生应用中,Spring Data JPA的审计支持、分页查询和二级缓存等特性,能够有效解决数据一致性、性能优化等工程难题。特别是其方法名解析查询策略和@Query注解 阅读详情

相关推荐

对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书

文章目录1. 什么是公钥和私钥?2. 加密算法2.1 对称加密2.2 非对称加密2.2.1 非对称加密的重要性质2.2.2 非对称加密算法应用2.2.2.1 应用1 加密通信2.2.2.1.1 单向认证和双向认证2.2.2.1 应用2 数字签名3. 数字签名3.1 数字签名用法演示3.2 数字签名存在问题4. 数字证书(Digital Certificate)4.1 创建数字证书4.1.1 举例,CA如何给我们签发一个有效证书: 1. 什么是公钥和私钥? 摘自《什么是公钥和私钥?》 公钥(Public Ke

m0_45406092的博客 1万+

关于hibernate不支持sqlserver中nchar映射的解决办法

需要返回nchar类型的数据时,则会报错`org.hibernate.MappingException: No Dialect mapping for JDBC type: -15` 此时我们可以使用`CAST ( colmname AS VARCHAR )`函数来将数据类型转化为varchar类型,这样就不会报错了

ledendary的博客 705

自抗扰控制(ADRC)原理与MATLAB实现详解

自抗扰控制(ADRC)是一种先进的鲁棒控制策略,其核心在于通过扩张状态观测器(ESO)实时估计并补偿系统总扰动。相比传统PID控制,ADRC不依赖精确数学模型,特别适合处理非线性、时变系统。从控制原理看,ADRC将系统内部动态和外部扰动统一建模,通过带宽参数化方法实现快速响应与强抗扰能力。在工程实践中,ADRC已成功应用于无人机飞控、伺服系统等场景,MATLAB仿真显示其上升时间可比PID提升46%,抗扰动恢复时间缩短60%。典型实现包含ESO设计、扰动补偿和PD控制三部分,参数整定遵循ω₀=3~5倍系统带

weixin_33585822的博客 95

Hibernate HQL截取字符串、数据类型转换

substring(cast(personRange as string),1,1) substring(str,1,3) 3个参数,第一个是字符串,第二个是截取的下标,第三个是截取的长度 cast(字段 as 类型) 需要注意的是,这里的类型要写的是java里的类型,而不是数据库里的类型,并且这个类型不能用包装类,否则会报错

w2222288的专栏 1万+

从零构建边缘AI数据管道:K230+ESP8266的物联网实践指南

本文详细介绍了如何利用K230开发板和ESP8266模块构建高可靠性的边缘AI数据管道,特别针对智能农业监测场景。通过完整的系统架构设计、AI模型部署、低功耗通信优化和云端集成方案,为开发者提供了一套可落地的物联网实践指南,重点解决了边缘计算环境下的数据传输稳定性和能效管理问题。

j2k3l4的博客 874

ESP32-CAM入门教程

ArduinoESP32-CAM下载模块(接上USB就能用,很方便,如果没有买就只有资金用USB-TTL了)如下图两个合在一起如下图。

qq_48778364的博客 3万+

hibernate 的cast函数

代码如下: String jpql = "select a from DeliverychargesItem a where 1=1"; List params = new ArrayList(); if (condition.get("companyCode") != null) { jpql += " and a.company.

dac55300424的专栏 4251

别再傻傻分不清:PX4、Pixhawk、ArduPilot、APM到底啥关系?一张图给你讲明白

本文全面解析开源飞控领域核心概念,厘清PX4、Pixhawk、ArduPilot与APM的定位与关系。通过硬件平台演进史和飞行控制软件对比,帮助开发者理解开源飞控生态,并提供新项目开发建议与特殊需求考量,助力无人机开发中的明智选择。

weixin_32770423的博客 413

hibernate 类型转换 CAST

 insert into  TEST (name, password,useId)select name,password, cast( 11  as long )  from user;  cast( 11  as long )  将11转换成LongType插入。

黄瓜和土豆的专栏 3925

解锁 Bootloader 不再难!HyperOS澎湃系统小米与红米手机通用

必要时,可以在工具右上角安装驱动模块,手动安装驱动。解决方法:确保手机升级到最新稳定版,登录同一个小米账号,并在。新机型解锁时需要等待一段时间,通常为 7 天。如果账号安全评分较低,解锁等待时间会更长。如果解锁失败提示权限不足,说明账号存在安全问题。出现这个错误时,通常是因为网络不稳定。如果解锁次数已满,需要等到下个月。解锁后,手机会重启,首次开机会稍微慢一些,等耐心等待即可。按钮,开始解锁过程,注意:解锁会清除手机内所有数据。7次,开启开发者选项。,右键解压到指定文件夹。,使用小米账号登录。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7228

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)一、设计目标二、电路展示三、存在的问题四、代码五、需要注意的问题 一、设计目标       前一阵子偶然接触到点灯科技平台,产生了制作一块ESP8266电路板,拥有以下功能: 使用CH340对ESP8266进行程序下载 使用DHT11进行温湿度数据读取 使用点灯科技平台接入物联网,可通过手机APP获得室内温湿度 接入小爱同学,通过语音获取室内温湿度信息 Mico US

weixin_43278295的博客 8853

Hibenate访问数据库表的char字段有风险

Hibenate访问数据库表的char字段有风险数据库JPA问题描述使用场景建表语句因为某些原因必须使用视图,举例比较简单(使用视图)因为视图不能有主键,所以没有建实体类Entity接收ResultSet 数据库 5.5.59-MariaDB JPA spring-data-jpa:2.3.4RELEASE 问题描述 返回前端的数据中, json对象的 email varchar(100) '电子邮箱 ',仅仅截取第一个字符 解决方案:可以在SQL语句中使用cast将char类型转成varcha

u011487710的博客 254

ONVIF协议简介与协议测试工具使用详解

Onvif协议及协议测试工具使用详解

dvlinker的技术专栏 3万+

金仓数据库KingbaseES客户端编程开发框架-Hibernate(5. Hibernate注意事项)

HQL(JPA QL)不支持KingbaseES特有的函数,包括:TO_HEX、UNICODE、SETSEED、STRPOS、GET_BIT、GET_BYTE、SET_BIT、SET_BYTE、EMPTY_BLOB、EMPTY_CLOB、CAST、ARRAY_NDIMS、ARRAY_FILL、UNNEST和ARRAY_LENGTH等。HQL(JPA QL)不支持某些操作符,包括:+、^、%、&、|、||、#和~等,以及UNION、UNION ALL、INTERSECT、EXCEPT。

arthemis_14的博客 723

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

hibernate hql函数

√通过 ⊙测试没结果,但没出错 ×未通过 方法     说明     类型     支持   测试结果HQL 使用方法 ABS(n)     取绝对值    数学函数    JPA QL HQL √   ABS(column_name[数字类型对象属性]) SQRT(n)     取平方根    数学函数    JPA QL HQL √   SQRT(column...

programloverjack的专栏 173

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mysql的函数使用及其他小技巧

我这篇为mysql的一些命令的杂记, 1> mysql的登录命令: 下面是几种登陆到MySql数据库的登陆方式代码(我最喜欢2),刚刚安装mysql的root账户是没有密码的. 1.mysql -u root -ppassword 2.mysql -u root -p Enter password:password 3.mysql ...

K_Y_Lee的博客 6556

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

按出生日期统计年龄段oracle原生SQL和hibernate中查询设计

select agerange ,count(*) as count from ( select case when to_char(sysdate,'yyyy')-to_char(birthdate,'yyyy') &gt;= '0' and to_char (sysdate,'yyyy')-to_char(birthdate,'yyyy') &lt...

轻耘智科技CTO 尤胜荣 的专栏 669

Hibernate、NHibernate下的函数汇总

Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。以下就是HQL的一些常用函数,有了这

xiezhijie的专栏 1036

jpa2.2升级后无法使用本地查询,nativeQuery = true,无法使用select *号,SpEL无法识别,#{#entityName}错误,函数无法识别,实体类扫描失败,解析sql失败等

目前新项目使用springboot3,相应的jpa也开始使用3.0+版本,还有部分项目从springboot2.2/2.3/2.5升级到2.7,合并项目,使用mybatis+jpa,且多数据源的情况,在使用jpa的过程中出现了如标题中描述的问题。

yuexiahunone的专栏 585

【mysql转达梦】mysql转DM达梦数据库+springboot兼容DM数据库+springboot兼容activity5.22.0(后续持续更新~~)

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM,它具有如下特点:1、通用性达梦数据库管理系统兼容多种硬件体系,可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致,使得DM各种组件在不同的硬件平台上具有一致的使用特性。

kjhjkhk的博客 3670

Orcale 切换 Mysql

Orcale 切换 Mysql 操作

weixin_45667323的博客 1016

SQL解析工具JSQLParser

是一个Java语言的SQL语句解析工具,功能十分强大,它可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,常见的持久层框架MyBatis-Plus就采用它作为SQL解析工具来实现某些功能。用于表示SQL中的字段对象,例如从一个Insert对象获取SQL要添加的全部字段:name,age,tenant_id。,这种结构左右连接着其他结构。是JSqlParser库中的一个核心接口,是用于表示SQL语句中的各种表达式的基类接口,通过调用对象的。获取查询的from后的结构(表,子查询等)

weixin_40347252的博客 101
上一篇: Sql Server 日期格式化函数
下一篇: Proxool+hibernate+spring时事务自动回滚导致无法提交的问题解决
fableking
博客等级 码龄20年 35粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值