Estoy tratando de definir una simple anotación @Select
en MyBatis para obtener una colección de objetos en base a los criterios definidos por una cláusula IN. El SQL se ve algo como:¿Puedo pasar una lista como parámetro a un asignador MyBatis?
SELECT * FROM employees WHERE employeeID IN (1, 2, 3);
La lista se genera de forma dinámica, por lo que no se sabe cuántos parámetros que tendrá. Me gustaría pasar simplemente en un List
de valores, algo así como:
@Select("SELECT * FROM employees WHERE employeeID IN(#{employeeIds})")
List<Employee> selectSpecificEmployees(@Param("employeeIds") List<Integer> employeeIds);
estoy creando una instancia de la Mapper
donde se define la anotación anterior y decir que es de la siguiente manera:
List<Integer> empIds = Arrays.asList(1, 2, 3);
List<Employee> result = mapper.selectSpecificEmployees(empIds);
Descubrí que esto no funciona.
org.apache.ibatis.exceptions.PersistenceException:
### Error de base de datos de la consulta. Causa: java.lang.NullPointerException
### El error puede implicar
com.mycompany.MySourceMapper.selectSpecificEmployees-inline
ocurrió ### El error al ajuste de parámetros ### Causa: java.lang.NullPointerException en org.apache.ibatis.exceptions.ExceptionFactory.wrapException (ExceptionFactory.java:8) en org.apache.ibatis.session.defaults.DefaultSqlSession.selectList (DefaultSqlSession.java:77) en org.apache.ibatis.session .defaults.DefaultSqlSession.selectList (DefaultSqlSession.java:69) en org.apache.ibatis.binding.MapperMethod.executeForList (MapperMethod.java:85) en org.apache.ibatis.binding.MapperMethod.execute (M apperMethod.java:65) en org.apache.ibatis.binding.MapperProxy.invoke (MapperProxy.java:35) en $ Proxy23.selectSpecificProductTypes (origen desconocido) en com.mycompany.MySourceMapperDebug.testSelectSpecificEmployees (MySourceMapperDebug.java: 60) en sun.reflect.NativeMethodAccessorImpl.invoke0 (nativo Método) en sun.reflect.NativeMethodAccessorImpl.invoke (origen desconocido) en sun.reflect.DelegatingMethodAccessorImpl.invoke (origen desconocido) en java.lang.reflect.Method .invoke (Fuente desconocida) en junit.framework.TestCase.runTest (TestCase.java:154) en junit.framework.TestCase.runBare (TestCase.java:127) en junit.framework.TestResult $ 1.protect (TestResult .java: 106) en junit.framework.TestResult.runProtected (TestResult.java:124) en junit.framework.TestResult.run (TestResult.java:109) en junit.framework.TestCase.run (TestCase.java:118) en junit.framework.TestSuite.runTest (TestSuite.java:208) en junit.framework.TestSuite.run (TestSuite.java:203) en org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run (JUnit3TestReference.java:130) en org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner. java: 467) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) en org.eclipse.jdt.internal.junit. runner.RemoteTestRunner.run (RemoteTestRunner.java:390) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197) causada por: java.lang.NullPointerException en org.apache .ibatis.type.UnknownTypeHandler.setNonNullParameter (UnknownTypeHandler.java: 21) en org.apache.ibatis.type.BaseTypeHandler.setParameter (BaseTypeHandler.java:23) en org.apache.ibatis.executor.parameter.DefaultParameterHandler.setParameters (DefaultParameterHandler.java:73) en org. apache.ibatis.executor.statement.PreparedStatementHandler.parameterize (PreparedStatementHandler.java:61) en org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize (RoutingStatementHandler.java:43) en org.apache.ibatis.executor. SimpleExecutor.prepareStatement (SimpleExecutor.java:56) en org.apache.ibatis.executor.SimpleExecutor.doQuery (SimpleExecutor.java:40) en org.apache.ibatis.executor.BaseExecutor.queryFromDatabase (BaseExecutor.java:216) en org.apache.ibatis.executor.BaseExecutor.query (BaseExecutor.java: 95) en org.apache.ibatis.executor.CachingExecutor.query (CachingExecutor.java:72) en sun.reflect.NativeMethodAccessorImpl.invoke0 (Nativo Método) en sun.reflect.NativeMethodAccessorImpl.invoke (origen desconocido) en sun.reflect.DelegatingMethodAccessorImpl.invoke (origen desconocido) en java.lang.reflect.Method.invoke (origen desconocido) en org.apache.ibatis.plugin.Invocation.proceed (Invocation.java:31)
.. 36 más
Creo que el problema está en la propia anotación. Parece que sería un requisito bastante común. ¿Debo convertir el List
a un String
y pasarlo como un parámetro String
en lugar de un List<Integer>
? ¿O hay alguna otra sintaxis para pasar un List
como parámetro a una anotación MyBatis?
Puede usar la configuración basada en xml y la anotación juntos mire esta publicación http://stackoverflow.com/questions/8788250/xml-annotation-based-configuration-for-mybatis/9076435 –