-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[insertList] [sql server] 不允许从数据类型 varbinary 到 datetime2 的隐式转换。请使用 CONVERT 函数来运行此查询。 #904
Comments
如何解决呢? |
很抱歉,能力有限,研究一下午了,没有头绪,还在跟...... |
这种语法没法 |
现在还不清楚问题是出在 mybatis 上还是,驱动上面。我在想在参数上添加 jdbcType 会不会解决这个问题。 我记得应该是可以在 <bind name="listNotEmptyCheck"
value="@tk.mybatis.mapper.util.OGNL@notEmptyCollectionCheck(list, 'com.simperfect.bp.stat.dao.MdCologIbTestMapper.insertList 方法参数为空')" />
INSERT INTO md_colog_ib_test <trim prefix="(" suffix=")" suffixOverrides=",">id,create_time,release_time,</trim> VALUES
<foreach collection="list" item="record" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">#{record.id},#{record.createTime},#{record.releaseTime},</trim>
</foreach> |
GitHub Copilot在批量插入数据时,如果其中一个日期为null,可能会导致错误。这是因为SQL Server不允许将null插入到 解决这个问题的一种方法是在插入数据之前检查日期是否为null。如果日期为null,你可以选择跳过这条数据,或者将日期设置为一个默认值。 以下是如何在Java代码中实现这个逻辑的示例: List<YourObject> objects = ...; // your list of objects to insert
objects = objects.stream()
.filter(obj -> obj.getCreateTime() != null && obj.getReleaseTime() != null)
.collect(Collectors.toList()); 在这个示例中,我们使用Java 8的流(Stream)API来过滤掉那些 如果你想为null的日期设置一个默认值,你可以使用 for (YourObject obj : objects) {
LocalDateTime defaultTime = LocalDateTime.of(2000, 1, 1, 0, 0); // default date
obj.setCreateTime(Optional.ofNullable(obj.getCreateTime()).orElse(defaultTime));
obj.setReleaseTime(Optional.ofNullable(obj.getReleaseTime()).orElse(defaultTime));
} 在这个示例中,我们为 |
设置默认值和排除null,都不太好,默认值肯定是不符合业务场景的。 |
添加类型是可以的,但是不能存在主键字段,否则会报错不允许插入主键: @Insert("<script>" +
"INSERT INTO md_colog_ib_test <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">create_time,release_time,</trim> VALUES" +
"<foreach collection=\"list\" item=\"record\" separator=\",\">" +
"<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">#{record.createTime,jdbcType=TIMESTAMP},#{record.releaseTime,jdbcType=TIMESTAMP},</trim>" +
"</foreach>" +
"</script>")
void saveBatch(List<MdCologIbTest> list); |
临时解决方案:基于我之前自定义的 自定义的 JakartaEntityResolve修改了 if (field.isAnnotationPresent(ColumnType.class)) {
ColumnType columnType = field.getAnnotation(ColumnType.class);
// 是否为 blob 字段
entityColumn.setBlob(columnType.isBlob());
// column可以起到别名的作用
if (StringUtil.isEmpty(columnName) && StringUtil.isNotEmpty(columnType.column())) {
columnName = columnType.column();
}
if (columnType.jdbcType() != JdbcType.UNDEFINED) {
entityColumn.setJdbcType(columnType.jdbcType());
}
if (columnType.typeHandler() != UnknownTypeHandler.class) {
entityColumn.setTypeHandler(columnType.typeHandler());
}
} else {
// 如果是时间类型则设置类型,防止 SQL server 下报错 https://github.com/abel533/Mapper/issues/904
if (field.getJavaType() == Date.class || field.getJavaType() == java.sql.Date.class) {
entityColumn.setJdbcType(JdbcType.TIMESTAMP);
}
} 完全重写了
|
关于“SQLServerException: 不允许从数据类型 varbinary 到 datetime2 的隐式转换”异常的解决办法,可以在实体类属性上添加字段注解 |
在 SQL server 2012 数据库中 insertList 方法会报错
不允许从数据类型 varbinary 到 datetime2 的隐式转换。请使用 CONVERT 函数来运行此查询。
触发条件
当多条数据中同时存在 datetime 类型,且其中有一个为 null 时就会触发。
以下情况不报错
以下情况报错
依赖环境
JDK 17、spring boot 3.0.9、mapper 4.2.3、mybatis 3.5.13、mssql-jdbc 11.2.3.jre17
堆栈信息
The text was updated successfully, but these errors were encountered: