MyBatis Batch Insert Error
Вставка SQL
<insert id="createConditionProducts" parameterType="PromotionConditionProduct">
INSERT INTO promotion_condition_product(<include refid="allExcludedId"/>)
VALUES
<foreach collection="list" index="index" item="item" separator=",">
(#{item.productId},#{item,type},#{item.promotionId},#{item.originPrice},#{item.currentPrice},#{item.canDeduction},
#{item.productName},#{item.groupId},#{item.createdTime},#{item.lastUpdatedTime},#{item.operatorName})
</foreach>
</insert>
sql
:
<resultMap id="conditionProductMap" type="PromotionConditionProduct">
<id column="id" property="id"/>
<result column="product_id" property="productId"/>
<result column="type" property="type"/>
<result column="promotion_id" property="promotionId"/>
<result column="origin_price" property="originPrice"/>
<result column="current_price" property="currentPrice"/>
<result column="can_deduction" property="canDeduction"/>
<result column="product_name" property="productName"/>
<result column="group_id" property="groupId"/>
<result column="created_time" property="createdTime"/>
<result column="last_updated_time" property="lastUpdatedTime"/>
<result column="operator_name" property="operatorName"/>
</resultMap>
<sql id="allExcludedId">
product_id,`type`,promotion_id,origin_price,current_price,can_deduction,
product_name,group_id,created_time,last_updated_time,operator_name
</sql>
Боб:
@Alias("PromotionConditionProduct")
public class PromotionConditionProduct {
private Integer id;
private String productId; //length [0,100]
private Byte type;
private Integer promotionId;
private Long originPrice;
private Long currentPrice;
private Long canDeduction;
private String productName; //length [0,200]
private Integer groupId;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastUpdatedTime;
private String operatorName; //length [0,100]
мой тестовый случай:
@Test
public void addPromotionConditionProducts() throws Exception {
List<PromotionConditionProduct> list = new ArrayList<>();
for (int i = 0; i< 100; i++){
PromotionConditionProduct item = new PromotionConditionProduct();
item.setProductId("testProduct_"+i).setPromotionId(1234).setType((byte)1)
.setGroupId(2).setProductName("testProductName_"+i);
list.add(item);
}
int res = promotionConditionProductService.addPromotionConditionProducts(list);
Assert.assertEquals(100,res);
}
ServiceImpl:
@Override
public int addPromotionConditionProducts(List<PromotionConditionProduct> conditionProducts) {
verifyCollectionParameter(conditionProducts);
Date now = new Date();
for (PromotionConditionProduct item : conditionProducts) {
if (item.getCreatedTime() == null) {
item.setCreatedTime(now).setLastUpdatedTime(now);
}
}
return promotionConditionProductDao.createConditionProducts(conditionProducts);
}
DAO:
@Repository
public interface PromotionConditionProductDao {
int createConditionProduct(PromotionConditionProduct conditionProduct);
int createConditionProducts(List<PromotionConditionProduct> conditionProductList);
и TestCase Fail с нижеуказанным исключением:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{__frch_item_0,type}. Check syntax #{property|(expression), var1=value1, var2=value2, ...}
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
at com.sun.proxy.$Proxy29.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:240)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:51)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at com.sun.proxy.$Proxy33.createConditionProducts(Unknown Source)
at com.lemall.srd.promotion.web.data.service.impl.PromotionConditionProductServiceImpl.addPromotionConditionProducts(PromotionConditionProductServiceImpl.java:64)
at com.lemall.srd.promotion.web.data.service.PromotionConditionProductServiceTest.addPromotionConditionProducts(PromotionConditionProductServiceTest.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:224)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{__frch_item_0,type}. Check syntax #{property|(expression), var1=value1, var2=value2, ...}
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.parseParameterMapping(SqlSourceBuilder.java:131)
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:71)
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:66)
at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:53)
at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:45)
at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:43)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:278)
at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:64)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:39)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:45)
at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:468)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:46)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:105)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)
at com.sun.proxy.$Proxy43.update(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:152)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
... 40 more
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 19
at java.lang.String.charAt(String.java:658)
at org.apache.ibatis.builder.ParameterExpression.trimmedStr(ParameterExpression.java:132)
at org.apache.ibatis.builder.ParameterExpression.option(ParameterExpression.java:125)
at org.apache.ibatis.builder.ParameterExpression.jdbcTypeOpt(ParameterExpression.java:100)
at org.apache.ibatis.builder.ParameterExpression.property(ParameterExpression.java:71)
at org.apache.ibatis.builder.ParameterExpression.parse(ParameterExpression.java:48)
at org.apache.ibatis.builder.ParameterExpression.<init>(ParameterExpression.java:40)
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.parseParameterMapping(SqlSourceBuilder.java:127)
... 66 more