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

0 ответов

Другие вопросы по тегам