Mapper
Mapper copied to clipboard
OracleMapper<T>接口的insertList 批量插入的时候ID还是报空怎么解决
我的代码: 继承通用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失败为空,所以插入不了,请问这个如何解决
可以看下tk.mybatis.mapper.additional.dialact.oracle.InsertListMapper
中的注释.
设计时考虑过如下两个方案:
- 单表时是通过新建
<selectKey>
节点实现的, 而每个insert
语句, 只能含有一个insertList!selectKey
, 所以集合插入时不适用。 - 使用批量插入语法直接嵌套序列子查询, 但本身Oracle这块支持就不友好 , 经尝试也不行。
所以要么你通过编码设置主键, 要么使用触发器; 或者直接uuid。。
好的,谢谢
才发现你生成的不是 oracle 语法呢, 确定走得是oracle里面的insertlist吗
是的,我也发现了,所以我重新改写了下,还是会抛出同样异常 【==> 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
你现在使用的哪种方式设置的主键? 全局配置下
<setting name="jdbcTypeForNull" value="NULL" />
设置这也是获取不到序列值的,单条的可以获取
这是最主要的原因
: ORA-01400: 无法将 NULL 插入 ("DUOMAI"."USERINFO"."ID")
批量本身就不能用序列,需要先设置好主键在批量插入。
没搞懂是哪的问题,有的类是可以进行更新的,有的就更新不了,看sql是以所有的字段为条件,但是我用的是updateByPrimaryKeySelective这个方法。一脸懵逼
我个213.。。。。id包导错了。。。。抱歉填麻烦了
你好, oracle批量插入是否支持selective呢? 批量更新怎么弄呢
我个213.。。。。id包导错了。。。。抱歉填麻烦了 如果list中有非空字段怎么办呢