前言
在写开始采集接口,用swagger测试时,报了一个这样的错:使用jpa插入数据报错“could not execute statement; SQL [n/a];nested exception.DataException
这个错误网上找了下,都说是插入的长度大于数据库设计字段的长度或者插入字段中为空,网上提供的解决思路就是将数据库主键设置为自动递增。想了下还是先别动数据库了怕影响别人用。我就换了思路,自己写了原生jpa插入的数据库,没有直接用save。但是问题又来了?jpa原生插入实体的sql怎么写呢?用了自己写的jpa插入实体的sql就不会报上面的错了?最后问题又是如何解决的?
答案就下方,让我们一起来探讨!
一、jpa原生插入实体的sql怎么写
示例如下:
@Transactional
@Modifying
@Query(value = "insert into tb_task(id,name,task_group_id,events_id,priority_id,status,is_timer,handler_time,type,is_delete) values(:task)",nativeQuery = true)
注意这里的 @Transactional是提交事务的意思,如果没有它这条sql的执行会报错。
但是问题又来了,虽然解决了这个错误,但依旧没有停止报错,idea运行还是出现了之前的那个错误。
二、继续解决could not execute statement; SQL [n/a];nested 错误
结果发现是因为数据类型设计的问题,库里面的字段用 了bit类型,但是在项目中实体层的数据类型写成了String。因此解决方案有两个:
1,把数据库的bit字段改成int类型
2,将实体层相对应的字段类型改为int类型
总结
mysql中int类型和bit类型,插入数据库时的区别:
1,如果bit类型想要正确的插入到数据库表中,它的sql语句的value部分的值,不能为字符串类型的(即数字不能用引号围绕),必须是int型
2,对于普通的int,插入数据库的sql值,带不带引号处理结果都是一样的。