Sto tentando di definire una semplice annotazione @Select
in MyBatis per ottenere una raccolta di oggetti in base a criteri definiti da una clausola IN. L'SQL assomiglia a qualcosa:Posso passare un elenco come parametro a un mappatore MyBatis?
SELECT * FROM employees WHERE employeeID IN (1, 2, 3);
L'elenco viene generato dinamicamente, quindi non so quanti parametri avrà. Mi piacerebbe passare solo in un List
di valori, qualcosa come:
@Select("SELECT * FROM employees WHERE employeeID IN(#{employeeIds})")
List<Employee> selectSpecificEmployees(@Param("employeeIds") List<Integer> employeeIds);
Sto creando un'istanza della Mapper
in cui è definito l'annotazione sopra e definendolo come segue:
List<Integer> empIds = Arrays.asList(1, 2, 3);
List<Employee> result = mapper.selectSpecificEmployees(empIds);
Ho scoperto che questo non funziona.
org.apache.ibatis.exceptions.PersistenceException:
### Errore database di interrogazione. Causa: java.lang.NullPointerException
### L'errore può comportare
com.mycompany.MySourceMapper.selectSpecificEmployees-Linea
### è verificato l'errore durante l'impostazione dei parametri ### Causa: java.lang.NullPointerException a org.apache.ibatis.exceptions.ExceptionFactory.wrapException (ExceptionFactory.java:8) su org.apache.ibatis.session.defaults.DefaultSqlSession.selectList (DefaultSqlSession.java:77) su org.apache.ibatis.session .defaults.DefaultSqlSession.selectList (DefaultSqlSession.java:69) all'indirizzo org.apache.ibatis.binding.MapperMethod.executeForList (MapperMethod.java:85) all'indirizzo org.apache.ibatis.binding.MapperMethod.execute (M apperMethod.java:65) a org.apache.ibatis.binding.MapperProxy.invoke (MapperProxy.java:35) a $ Proxy23.selectSpecificProductTypes (Fonte sconosciuta) a com.mycompany.MySourceMapperDebug.testSelectSpecificEmployees (MySourceMapperDebug.java: 60) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) a sun.reflect.NativeMethodAccessorImpl.invoke (fonte sconosciuta) a sun.reflect.DelegatingMethodAccessorImpl.invoke (fonte sconosciuta) a java.lang.reflect.Method .invoke (sorgente sconosciuta) su junit.framework.TestCase.runTest (TestCase.java:154) su junit.framework.TestCase.runBare (TestCase.java:127) su junit.framework.TestResult $ 1.protect (TestResult .java: 106) a junit.framework.TestResult.runProtected (TestResult.java:124) a junit.framework.TestResult.run (TestResult.java:109) a junit.framework.TestCase.run (TestCase.java:118) in junit.framework.TestSuite.runTest (TestSuite.java:208) all'indirizzo junit.framework.TestSuite.run (TestSuite.java:203) all'indirizzo org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run (JUnit3TestReference.java:130) all'indirizzo org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) all'indirizzo org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner. java: 467) all'indirizzo org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) all'indirizzo org.eclipse.jdt.internal.junit. runner.RemoteTestRunner.run (RemoteTestRunner.java:390) a org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197) provocato da: java.lang.NullPointerException a org.apache .ibatis.type.UnknownTypeHandler.setNonNullParameter (UnknownTypeHandler.java: 21) all'indirizzo org.apache.ibatis.type.BaseTypeHandler.setParameter (BaseTypeHandler.java:23) all'indirizzo org.apache.ibatis.executor.parameter.DefaultParameterHandler.setParameters (DefaultParameterHandler.java:73) presso org. apache.ibatis.executor.statement.PreparedStatementHandler.parameterize (PreparedStatementHandler.java:61) all'indirizzo org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize (RoutingStatementHandler.java:43) su org.apache.ibatis.executor. SimpleExecutor.prepareStatement (SimpleExecutor.java:56) su org.apache.ibatis.executor.SimpleExecutor.doQuery (SimpleExecutor.java:40) su org.apache.ibatis.executor.BaseExecutor.queryFromDatabase (BaseExecutor.java:216) su org.apache.ibatis.executor.BaseExecutor.query (BaseExecutor.java: 95) a org.apache.ibatis.executor.CachingExecutor.query (CachingExecutor.java:72) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) a sun.reflect.NativeMethodAccessorImpl.invoke (fonte sconosciuta) a sun.reflect.DelegatingMethodAccessorImpl.invoke (fonte sconosciuta) a java.lang.reflect.Method.invoke (fonte sconosciuta) a org.apache.ibatis.plugin.Invocation.proceed (Invocation.java:31)
.. 36 altro
Penso che il problema sia nell'annotazione stessa. Sembra che sarebbe un requisito abbastanza comune. Devo convertire lo List
in un String
e inoltrarlo come parametro String
anziché List<Integer>
? O c'è qualche altra sintassi per passare un List
come parametro per un'annotazione MyBatis?
È possibile utilizzare sia la configurazione di xml sia quella basata su annotazione per guardare questo post http://stackoverflow.com/questions/8788250/xml-annotation-based-configuration-for-mybatis/9076435 –