Mapper icon indicating copy to clipboard operation
Mapper copied to clipboard

OracleMapper<T>接口的insertList 批量插入的时候ID还是报空怎么解决

Open LiuDangYang opened this issue 6 years ago • 11 comments

我的代码: 继承通用mapper @RegisterMapper public interface TkMapper<T> extends Mapper<T>, OracleMapper<T> { } 业务mapper @Mapper @Repository public interface UserinfoMapper extends TkMapper<Userinfo> { }

public void test() { List<Userinfo> userinfos = new ArrayList<Userinfo>(); Userinfo userinfo = new Userinfo(); userinfo.setEmail("[email protected]"); userinfo.setRegdate(new Date()); userinfo.setUsername("测试1"); userinfo.setUserpwd("11111111"); Userinfo userinfo2 = new Userinfo(); userinfo2.setEmail("[email protected]"); userinfo2.setRegdate(new Date()); userinfo2.setUsername("测试2"); userinfo2.setUserpwd("22222222"); userinfos.add(userinfo); userinfos.add(userinfo2); int i = userinfoMapper.insertList(userinfos); } 实体类 @Data @NoArgsConstructor @AllArgsConstructor @Table(name = "userinfo") public class Userinfo implements Serializable { private static final long serialVersionUID = 7369711899100020179L;

/*
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "select seq_userinfo.nextval from dual")*/
@Id
@Column(name = "ID")
@KeySql(order = ORDER.BEFORE, sql = "select seq_userinfo.nextval from dual")
private Long id;
private String username;
private String userpwd;
private String email;
private Date regdate;

} 下面是报错信息 【==> Preparing: INSERT INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) , ( ?,?,?,?,? ) 】【com.caib.dao.mapper.boss.UserinfoMapper.insertList】 【Resolved [org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='__frch_record_0.id', mode=IN, javaType=class java.lang.Long, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111]】【org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver】 单条插入是可以的,批量的还是因为获取序列的id失败为空,所以插入不了,请问这个如何解决

LiuDangYang avatar Nov 26 '18 09:11 LiuDangYang

可以看下tk.mybatis.mapper.additional.dialact.oracle.InsertListMapper中的注释.

设计时考虑过如下两个方案:

  • 单表时是通过新建<selectKey>节点实现的, 而每个insert语句, 只能含有一个insertList!selectKey, 所以集合插入时不适用。
  • 使用批量插入语法直接嵌套序列子查询, 但本身Oracle这块支持就不友好 , 经尝试也不行。

所以要么你通过编码设置主键, 要么使用触发器; 或者直接uuid。。

qrqhuang avatar Nov 26 '18 15:11 qrqhuang

好的,谢谢

LiuDangYang avatar Nov 27 '18 01:11 LiuDangYang

才发现你生成的不是 oracle 语法呢, 确定走得是oracle里面的insertlist吗

qrqhuang avatar Nov 27 '18 13:11 qrqhuang

是的,我也发现了,所以我重新改写了下,还是会抛出同样异常 【==> Preparing: INSERT ALL INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) INTO userinfo ( id,username,userpwd,email,regdate ) VALUES ( ?,?,?,?,? ) SELECT 1 FROM DUAL 】【com.caib.dao.mapper.boss.UserinfoMapper.insertList】 异常 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='__frch_record_0.id', mode=IN, javaType=class java.lang.Long, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111

LiuDangYang avatar Nov 28 '18 08:11 LiuDangYang

你现在使用的哪种方式设置的主键? 全局配置下

<setting name="jdbcTypeForNull" value="NULL" />

qrqhuang avatar Dec 02 '18 05:12 qrqhuang

设置这也是获取不到序列值的,单条的可以获取 这是最主要的原因 : ORA-01400: 无法将 NULL 插入 ("DUOMAI"."USERINFO"."ID") image

LiuDangYang avatar Dec 03 '18 04:12 LiuDangYang

批量本身就不能用序列,需要先设置好主键在批量插入。

abel533 avatar Dec 08 '18 02:12 abel533

default 没搞懂是哪的问题,有的类是可以进行更新的,有的就更新不了,看sql是以所有的字段为条件,但是我用的是updateByPrimaryKeySelective这个方法。一脸懵逼

LiuDangYang avatar Dec 14 '18 06:12 LiuDangYang

我个213.。。。。id包导错了。。。。抱歉填麻烦了

LiuDangYang avatar Dec 14 '18 06:12 LiuDangYang

你好, oracle批量插入是否支持selective呢? 批量更新怎么弄呢

lwb58 avatar Nov 30 '20 03:11 lwb58

我个213.。。。。id包导错了。。。。抱歉填麻烦了 如果list中有非空字段怎么办呢

lwb58 avatar Nov 30 '20 07:11 lwb58