クエリの結果として null ではなく、空のコレクションを作成することをお勧めします。コレクションを操作するときは、通常、各アイテムをループして、次のように何かを行います。
List<User> resultList = (List<User>) sqlSession.select("statementId");
for (User u : resultList) {
//...
}
リストが空の場合は何もしません。
ただし、null を返す場合は、コードを NullPointerExceptions から保護し、代わりに次のようなコードを記述する必要があります。
List<User> resultList = (List<User>) sqlSession.select("statementId");
if (resultList != null) {
for (User u : resultList) {
//...
}
}
通常は最初のアプローチの方が優れており、MyBatis はそのように動作しますが、それが本当に必要な場合は、強制的に null を返すようにすることもできます。
そのために、MyBatisプラグインを作成して任意のクエリの呼び出しをインターセプトし、クエリ結果が空の場合は null を返すことができます。
ここにいくつかのコードがあります:
構成に次を追加します。
<plugins>
<plugin interceptor="pack.test.MyInterceptor" />
</plugins>
インターセプター コード:
package pack.test;
import java.util.List;
import java.util.Properties;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
@Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}) })
public class MyInterceptor implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
Object result = invocation.proceed();
List<?> list = (List<?>) result;
return (list.size() == 0 ? null : result);
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
}
}
ResultSetHandler
の代わりにへの呼び出しをインターセプトすると、インターセプターのスコープをさらに制限できますExecutor
。