You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Grails更新User域对象时出现java.lang.Byte无法转为[B错误

解决Grails中executeUpdate更新byte[]字段的类型转换错误

这个报错java.lang.Byte cannot be cast to [B其实很好理解——Hibernate在处理你传递的byte数组参数时,没把它当成完整的数组,反而试图把数组里的单个Byte元素赋值给password_Salt这个byte[]类型的字段,自然就出现类型不匹配的问题了。

给你两种靠谱的解决办法,按需选择:

方法一:用Grails ORM的常规更新方式(推荐)

这种方式最符合Grails的开发习惯,也不容易踩类型映射的坑:

// 先获取要更新的User实例
def user = User.get(userId)
if (user) {
    // 直接修改byte[]字段
    user.password_Salt = new byte[] { ... } // 你的新salt数组
    // 保存并立即刷新到数据库
    user.save(flush: true, failOnError: true)
}

Grails会自动帮你处理ORM的类型转换,完全不用操心参数类型的问题,还能享受Grails的验证、事件回调等特性。

方法二:坚持用executeUpdate?指定参数类型就行

如果你一定要用HQL的批量更新,那得明确告诉Hibernate这个参数是byte数组类型。可以借助Hibernate的类型常量来指定:

import org.hibernate.type.StandardBasicTypes

def session = sessionFactory.currentSession
def query = session.createQuery("update User set password_Salt=:salt where id=:userId")
// 明确指定参数为BINARY类型(对应byte[])
query.setParameter("salt", new byte[] { ... }, StandardBasicTypes.BINARY)
query.setParameter("userId", userId)
query.executeUpdate()

这样Hibernate就不会把数组拆成单个元素,能正确识别这是一个byte数组参数,自然就不会报类型转换错误了。

另外要注意:你的域类里字段名是password_Salt,HQL里也要严格对应这个名称,别写错了哦。

内容的提问来源于stack exchange,提问作者user2430147

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:40