About MyBatis batch update

397 views
Skip to first unread message

sun...@163.com

unread,
Oct 19, 2011, 1:38:52 AM10/19/11
to mybatis-user
Hi,
I have a question that

<update id="updatesql" >
UPDATE
Table1
SET

colC = 'CC'

<foreach collection="list" item="item" index="index"
separator=" OR">
WHERE
(colA = #{item.a} ADN colB = #{item.b})

</foreach>

</update>

The value of 'SET' and the condition of 'WHERE' both are dynamic from
a List.
Now only 'WHERE' condition can do.
'SET' condition how can do?

thank you vary mush.

Simone Tripodi

unread,
Oct 19, 2011, 2:35:02 PM10/19/11
to mybati...@googlegroups.com
Not sure I understand what the question is, but for what I can see the
WHERE string is misplaced, anyway you have to put it outside the
foreach:

WHERE


<foreach collection="list" item="item" index="index"
separator=" OR">

(colA = #{item.a} ADN colB = #{item.b})
</foreach>

HTH,
Simo

http://people.apache.org/~simonetripodi/
http://simonetripodi.livejournal.com/
http://twitter.com/simonetripodi
http://www.99soft.org/

Poitras Christian

unread,
Oct 20, 2011, 10:05:40 AM10/20/11
to mybati...@googlegroups.com
Hi,

When I updated my MyBatis dependency to 3.0.6, I got this weird exception. MyBatis 3.0.5 works like a charm with the same config.
Are there any differences that could cause this problem?

Christian


1) An error occurred while building the org.apache.ibatis.session.Configuration
while locating org.mybatis.guice.configuration.$ConfigurationProvider
at org.mybatis.guice.MyBatisModule.internalConfigure(MyBatisModule.java:108)
while locating org.apache.ibatis.session.Configuration
for parameter 0 at org.mybatis.guice.session.$SqlSessionFactoryProvider.createNewSqlSessionFactory(SqlSessionFactoryProvider.java:64)
at org.mybatis.guice.session.$SqlSessionFactoryProvider.class(SqlSessionFactoryProvider.java:31)
while locating org.mybatis.guice.session.$SqlSessionFactoryProvider
at org.mybatis.guice.MyBatisModule.internalConfigure(MyBatisModule.java:109)
while locating org.apache.ibatis.session.SqlSessionFactory
for parameter 0 at org.mybatis.guice.session.$SqlSessionManagerProvider.createNewSqlSessionManager(SqlSessionManagerProvider.java:53)
at org.mybatis.guice.session.$SqlSessionManagerProvider.class(SqlSessionManagerProvider.java:29)
while locating org.mybatis.guice.session.$SqlSessionManagerProvider
at org.mybatis.guice.AbstractMyBatisModule.configure(AbstractMyBatisModule.java:45)
while locating org.apache.ibatis.session.SqlSessionManager
for field at org.mybatis.guice.mappers.$MapperProvider.sqlSessionManager(MapperProvider.java:40)
while locating org.mybatis.guice.mappers.$MapperProvider
at com.google.inject.util.Providers$3.initialize(Providers.java:101)
at org.mybatis.guice.AbstractMyBatisModule.bindMapper(AbstractMyBatisModule.java:62)
Caused by: java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.NullPointerException
at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:100)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:75)
at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.loadXmlResource(MapperAnnotationBuilder.java:119)
at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:92)
at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:45)
at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:463)
at org.mybatis.guice.configuration.$ConfigurationProvider.get(ConfigurationProvider.java:256)
at org.mybatis.guice.configuration.$ConfigurationProvider.get(ConfigurationProvider.java:43)
at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:55)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:83)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:94)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:53)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:83)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:94)
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:53)
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
at com.google.inject.Scopes$1$1.get(Scopes.java:65)
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:53)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:60)
at com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:944)
at com.google.inject.util.Providers$3.initialize(Providers.java:101)
at com.google.inject.util.Providers$3$$FastClassByGuice$$14d1a0ba.invoke(<generated>)
at com.google.inject.internal.cglib.reflect.$FastMethod.invoke(FastMethod.java:53)
at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:56)
at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:90)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73)
at com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:147)
at com.google.inject.internal.Initializer.injectAll(Initializer.java:92)
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:173)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:72)
at com.google.inject.Guice.createInjector(Guice.java:62)
at ca.qc.ircm.proview.web.WebGuiceConfiguration.contextInitialized(WebGuiceConfiguration.java:46)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
at org.apache.ibatis.mapping.ResultMapping.equals(ResultMapping.java:177)
at java.util.ArrayList.indexOf(ArrayList.java:216)
at java.util.ArrayList.contains(ArrayList.java:199)
at java.util.AbstractCollection.removeAll(AbstractCollection.java:336)
at org.apache.ibatis.builder.MapperBuilderAssistant.addResultMap(MapperBuilderAssistant.java:138)
at org.apache.ibatis.builder.ResultMapResolver.resolve(ResultMapResolver.java:28)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:255)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:223)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:215)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:96)
... 81 more


Poitras Christian

unread,
Oct 20, 2011, 1:38:46 PM10/20/11
to mybati...@googlegroups.com
The problem is that ResultMapping.equals() rely on a defined property attribute. If ResultMapping is related to an <arg> or <idArg> element, the property field is null and ResultMapping.equals() / ResultMapping.hashCode() throws an NPE.
I've made a unit test for this an I'll add an issue.

Christian

-----Message d'origine-----
De : mybati...@googlegroups.com [mailto:mybati...@googlegroups.com] De la part de Poitras Christian
Envoyé : October-20-11 10:06 AM
À : 'mybati...@googlegroups.com'
Objet : NPE in ResultMapping with mybatis 3.0.6

Tim

unread,
Oct 21, 2011, 11:31:53 PM10/21/11
to mybati...@googlegroups.com
Did you create an issue for this?

Poitras Christian

unread,
Oct 24, 2011, 8:23:16 AM10/24/11
to mybati...@googlegroups.com

Created and solved.

See issue 417.

http://code.google.com/p/mybatis/issues/detail?id=417

 

Christian

 

De : mybati...@googlegroups.com [mailto:mybati...@googlegroups.com] De la part de Tim
Envoyé : October-21-11 11:32 PM
À : mybati...@googlegroups.com
Objet : Re: NPE in ResultMapping with mybatis 3.0.6

Reply all
Reply to author
Forward
0 new messages