[ 
https://issues.apache.org/jira/browse/CAMEL-5143?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13249472#comment-13249472
 ] 

Aaron Daubman commented on CAMEL-5143:
--------------------------------------

Not sure if this needs to be updated to check for greater-than-zero elements in 
the list to be processed? I have run into an issue where further up the route 
BeanIO encounters an invalid record, and, having setIgnoreInvalidRecords set to 
true, ignores it. Ideally, there would be a parameter for camel-beanio (similar 
to camel-mybatis' consumer.routeEmptyResultSet) that would prevent beanio from 
routing an empty body, however, I did not see any such option. So, camel-beanio 
passes the empty list along to MyBatis, which then tries (with foreach) to 
iterate over the list to produce the insert statement for the DB... since the 
list is empty, the SQL is never fully formed, and results in a SQL Query format 
error.

Should:
1) The code I provided check to see if the list is >0 (if so, what should the 
behavior be if in.size() == 0)?
2) Should an option be added to camel-beanio to prevent routing of empty 
message bodies? If so, how should this be done?
                
> Add a new camel-mybatis statementType of 'InsertList' (similar to SelectOne 
> versus SelectList) to allow for mybatis foreach driven batch insert statements
> ----------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-5143
>                 URL: https://issues.apache.org/jira/browse/CAMEL-5143
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-mybatis
>    Affects Versions: 2.10.0
>            Reporter: Aaron Daubman
>            Assignee: Claus Ibsen
>            Priority: Minor
>              Labels: batch, foreach, insert, mybatis
>             Fix For: 2.10.0
>
>         Attachments: MyBatisInsertListTest.java, Patch_for_CAMEL-5143.txt
>
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> The camel-mybatis code will iterate over any list passed in and attempt to 
> insert each item individually, bypassing foreach support in statements like:
>     <insert id="batchInsertdataCore" parameterType="java.util.List">
>         INSERT INTO CORE_DATA (
>         <include refid="dataCoreColumns"/>
>         )
>         VALUES (
>         <foreach item="dataCore" collection="_parameter" open="" close="" 
> separator="),(">
>             #{dataCore.event_id}, #{dataCore.start_time_val}, 
> #{dataCore.end_time_val}
>         </foreach>
>         )
>     </insert>
> This results in mybatis generating the following error even when the route is 
> receiving a list of objects as desired:
> ### Error updating database.  Cause: 
> org.apache.ibatis.builder.BuilderException: Error evaluating expression 
> '_parameter'.  Return value (dataCore{
>     event_id=111222333,
>     start_time_val=Thu Mar 01 02:03:04 EST 2001,
>     end_time_val=Thu Mar 01 02:03:05 EST 2001,
> }
> ) was not iterable.
> ### The error may exist in mybatis/dataCore.xml
> ### The error may involve dataCore.batchInsertdataCore
> ### The error occurred while executing an update
> ---from 
> camel/trunk/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java
>  ---
>     private void doInsert(Exchange exchange) throws Exception {
>         SqlSessionFactory client = endpoint.getSqlSessionFactory();
>         SqlSession session = client.openSession();
>         try {
>             Object result;
>             Object in = exchange.getIn().getBody();
>             if (in != null) {
>                 // lets handle arrays or collections of objects
>                 Iterator<?> iter = ObjectHelper.createIterator(in);
>                 while (iter.hasNext()) {
>                     Object value = iter.next();
>                     LOG.trace("Inserting: {} using statement: {}", value, 
> statement);
>                     result = session.insert(statement, value);
>                     doProcessResult(exchange, result);
>                 }
>             } else {
>                 LOG.trace("Inserting using statement: {}", statement);
>                 result = session.insert(statement);
>                 doProcessResult(exchange, result);
>             }
>         } finally {
>             session.commit();
>             session.close();
>         }
>     }
> ---from 
> camel/trunk/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java
>  ---
> It should be simple to add a new statementType = 'InsertList' (similar to 
> SelectOne versus SelectList) and add it to the switch statement further up in 
> the MyBatisProducer.java code.
> Then a new doInsertBatch would be created, copying the code above and just 
> emoving the iterator related code, simply calling:
> result = session.insert(statement, in);

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to