Использование Mybatis Plus для упаковки ошибок пакетного запроса - PullRequest
0 голосов
/ 25 февраля 2019

Использование Mybatis Plus для упаковки ошибок пакетного запроса

Сцены

Мне нужно инкапсулировать общий метод, который можно запрашивать в соответствии со списком объектов, поэтому я написал следующий метод.Примечание. Этот класс наследует IServiceImpl

Public List<T> listBatchByEntityList(List<T> entityList) {
    Try (final SqlSession batchSqlSession = sqlSessionBatch()) {
        Final int size = entityList.size();
        Final int batchSize = 30;
        Final List<T> result = new ArrayList<>();
        For (int i = 0; i < size; i++) {
            Final String sqlStatement = sqlStatement(SqlMethod.SELECT_LIST);
            Final List<T> list = batchSqlSession.selectList(sqlStatement, new EntityWrapper<>(entityList.get(i)));
            result.addAll(list);
            If (i >= 1 && i % batchSize == 0) {
                batchSqlSession.flushStatements();
            }
        }
        batchSqlSession.flushStatements();
        Return result;
    } catch (Exception e) {
        Throw new GlobalException("Error: Cannot execute listBatchByEntityList Method. Cause", e);
    }
}

Однако во время выполнения возникла исключительная ситуация.

Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'ew' in 'class com.baomidou.mybatisplus.mapper.EntityWrapper'
### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'ew' in 'class com.baomidou.mybatisplus.mapper.EntityWrapper'
At org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
At org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
At org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
At com.zx.idc.ds.common.service.impl.BaseServiceImpl.listBatchByEntityList(BaseServiceImpl.java:54)
... 37 more
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'ew' in 'class com.baomidou.mybatisplus.mapper.EntityWrapper'
At org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:419)
At org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164)
At org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162)
At org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
At org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
At org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:94)
At org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:108)
At org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2685)
At org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114)
At org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
At org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
At org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)
At org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
At org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
At org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61)
At org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
At org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
At org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:470)
At org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:434)
At org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)
At org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
At org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
At org.apache.ibatis.scripting.xmltags.ChooseSqlNode.apply(ChooseSqlNode.java:35)
At org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)
At org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)
At org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
At org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:134)
At org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
... 39 more

Кто-нибудь сталкивался с такой ситуацией?

1 Ответ

0 голосов
/ 30 июля 2019

извините за поздний ответ.

проблема в том, что вы вызвали batchSqlSession.selectList и использовали параметр напрямую, но в mybatis-plus (2.x) метод baseMapper.selectList (@Param ("ew") Wrapper ew), параметр имеет аннотацию @Param, которая будет обработана org.apache.ibatis.reflection.ParamNameResolver (строка 121 @ mybatis-3.4.6) и обернута как ParamMap.

Итак, разрешение простое:

некоторые изменения кода:

final Map<String, Object> param = new MapperMethod.ParamMap<Object>();
EntityWrapper<T> ew = new EntityWrapper<>(entityList.get(i));
param.put("ew", ew);
param.put("param1", ew);
final List<T> list = batchSqlSession.selectList(sqlStatement, param);

Полные коды, как показано ниже:

public List<T> listBatchByEntityList(List<T> entityList) {
    try (final SqlSession batchSqlSession = sqlSessionBatch()) {
        final int size = entityList.size();
        final int batchSize = 30;
        final List<T> result = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            final String sqlStatement = sqlStatement(SqlMethod.SELECT_LIST);
            final Map<String, Object> param = new MapperMethod.ParamMap<Object>();
            EntityWrapper<T> ew = new EntityWrapper<>(entityList.get(i));
            param.put("ew", ew);
            param.put("param1", ew);
            final List<T> list = batchSqlSession.selectList(sqlStatement, param);
            result.addAll(list);
            if (i >= 1 && i % batchSize == 0) {
                batchSqlSession.flushStatements();
            }
        }
        batchSqlSession.flushStatements();
        return result;
    } catch (Exception e) {
        throw new GlobalException("Error: Cannot execute listBatchByEntityList Method. Cause", e);
    }
}

проверено нормально.

Кстати, пожалуйста, не стесняйтесь ставить вопрос о https://github.com/baomidou/mybatis-plus/issues, независимо от ошибки, связанной с использованием mybatis-plus

С уважением

участника из Mybatis-plus:)

...