Я пытаюсь определить простую аннотацию @Select
в MyBatis, чтобы получить коллекцию объектов на основе критериев, определенных в разделе IN. SQL выглядит примерно так:
SELECT * FROM employees WHERE employeeID IN (1, 2, 3);
Список генерируется динамически, поэтому я не знаю, сколько его параметров будет иметь. Я хотел бы просто передать значения List
, например:
@Select("SELECT * FROM employees WHERE employeeID IN( #{employeeIds} )")
List<Employee> selectSpecificEmployees(@Param("employeeIds") List<Integer> employeeIds);
Я создаю экземпляр Mapper
, где указанная выше аннотация, и вызывает ее следующим образом:
List<Integer> empIds = Arrays.asList(1, 2, 3);
List<Employee> result = mapper.selectSpecificEmployees(empIds);
Я обнаружил, что это не работает.
org.apache.ibatis.exceptions.PersistenceException:
### Ошибка запроса базы данных. Причина: java.lang.NullPointerException
### Ошибка может включать в себя com.mycompany.MySourceMapper.selectSpecificEmployees-Инлайн
### Ошибка при настройке параметров ### Причина: java.lang.NullPointerException at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:77) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:69) на org.apache.ibatis.binding.MapperMethod.executeForList(MapperMethod.java:85) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:65) на org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35) в $Proxy23.selectSpecificProductTypes(Неизвестный источник) на com.mycompany.MySourceMapperDebug.testSelectSpecificEmployees(MySourceMapperDebug.java:60) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke(Неизвестный источник) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Неизвестный источник) в java.lang.reflect.Method.invoke(Неизвестный источник) в junit.framework.TestCase.runTest(TestCase.java:154) в junit.framework.TestCase.runBare(TestCase.java:127) в junit.framework.TestResult $1.protect(TestResult.java:106) в junit.framework.TestResult.runProtected(TestResult.java:124) в junit.framework.TestResult.run(TestResult.java:109) в junit.framework.TestCase.run(TestCase.java:118) в junit.framework.TestSuite.runTest(TestSuite.java:208) в junit.framework.TestSuite.run(TestSuite.java:203) на org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Вызывается: java.lang.NullPointerException at org.apache.ibatis.type.UnknownTypeHandler.setNonNullParameter(UnknownTypeHandler.java:21) at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:23) at org.apache.ibatis.executor.parameter.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:73) at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:61) at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:43) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:56) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:40) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:216) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:95) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:72) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke(Неизвестный источник) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Неизвестный источник) в java.lang.reflect.Method.invoke(Неизвестный источник) на org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:31)
... 36 больше
Я думаю, проблема в самой аннотации. Похоже, это было бы довольно распространенным требованием. Нужно ли преобразовать List
в String
и передать это как параметр String
вместо List<Integer>
? Или есть какой-то другой синтаксис для передачи List
в качестве параметра аннотации MyBatis?