使用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
相关产品推荐
相关产品推荐

