Error de Mybatis de no se pudo encontrar el mapa de resultados java.util.List

1. Reproducir el error

Mensaje de error:

13:41:33.539 ERROR com.fast.framework.advice.FastBootControllerAdvice 58 errorHandler - Could not find result map java.util.List org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.util.List
	at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:346) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:290) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:109) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.session.Configuration.lambda$buildAllStatements$2(Configuration.java:787) ~[mybatis-3.5.0.jar:3.5.0]
	at java.util.Collection.removeIf(Collection.java:414) ~[?:1.8.0_112]
	at org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:786) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:763) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:758) ~[mybatis-3.5.0.jar:3.5.0]
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod$SqlCommand.resolveMappedStatement(MybatisMapperMethod.java:264) ~[mybatis-plus-core-3.1.0

2. Fondo

En primer lugar, vaya al sitio web oficial para confirmar que el uso de resultMap y resultType es correcto. Este artículo no analiza el uso básico, por lo tanto, los errores después de usar myabtis de manera competente

Sitio web oficial: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#select

3. Recupera la escena

(1) La capa de Dao tiene dos métodos, recuerde que estos dos rápidos son normales y la prueba es incorrecta

int selectFast();

int selectTest();

(2) Correspondiente a xml, donde selectTest es problemático, resultMap = "java.util.List" es incorrecto para escribir

<select id="selectFast" resultType="java.lang.Integer">
    select count(1) from sys_user
</select>

<select id="selectTest" resultMap="java.util.List">
    select count(1) from sys_user
</select>

(3) Entonces solo llamo al método normal int selectFast ();

masterDao.selectFast()

(4) La limpieza, la instalación y el paquete normales de maven son todos normales

(5) Después de compilar e iniciar, también se inicia normalmente

(6) Luego, cuando se llama al método normal selectFast a través del controlador, se informa el error inicial

No se pudo encontrar el mapa de resultados java.util.List

(7) Similar a este error, habrá una pista donde ocurrió el error. La pista de este error es:

en com.fast.web.controller.TestController.getString (TestController.java:25) ~ [clases / :?]

Esta es la línea 25 de este TestController, también llamé a este método, es razonable decir

(8) ¿Pero cuál es el problema incorrecto?

El método int selectFast () al que estoy llamando actualmente es normal. No hay ningún problema con el código y la interfaz de llamada es solo este método, por lo que el código debería ejecutarse normalmente.

Pero mybatis devolvió un error, devolviendo un método (int selectTest ();) que era irrelevante para la llamada de la interfaz en ese momento. Sin embargo, este error no reportó un error durante la fase de compilación y la fase de inicio. Al llamar a otros métodos, se solicita el error de este método y la posición del error es la posición del método correcto.

Idea : Primero resuelva el problema, luego aclare el problema, corrija directamente el error del método irrelevante, modifique de la siguiente manera, el método int selectTest (); el método es normal, y la solicitud para volver a visitar es normal.

<select id="selectTest" resultType="java.lang.Integer">
    select count(1) from sys_user
</select>

La solución en ese momento era la depuración : debido al método normal que solicité, el parámetro de retorno debería ser resultType, pero ¿de dónde vino este resultMap y también reportó un error? Mire la ubicación del mensaje de error mostrado por mybatis.

14:04:46.787 ERROR com.fast.framework.advice.FastBootControllerAdvice 58 errorHandler - Could not find result map java.util.List org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.util.List
	at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:346) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:290) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:109) ~[mybatis-3.5.0.jar:3.5.0]
	at org.apache.ibatis.session.Configuration.lambda$buildAllStatements$2(Configuration.java:787) ~[mybatis-3.5.0.jar:3.5.0]
	at java.util.Collection.removeIf(Collection.java:414) ~[?:1.8.0_112]

Busque esto (XMLStatementBuilder.java:109) y cree un punto de interrupción. A continuación se muestra el código fuente de mybatis. El punto de interrupción se coloca en la última línea.

Vuelva a solicitar, vea los parámetros de resultMap enviados

 public void parseStatementNode() {
        String id = this.context.getStringAttribute("id");
        String databaseId = this.context.getStringAttribute("databaseId");
        if (this.databaseIdMatchesCurrent(id, databaseId, this.requiredDatabaseId)) {
            Integer fetchSize = this.context.getIntAttribute("fetchSize");
            Integer timeout = this.context.getIntAttribute("timeout");
            String parameterMap = this.context.getStringAttribute("parameterMap");
            String parameterType = this.context.getStringAttribute("parameterType");
            Class<?> parameterTypeClass = this.resolveClass(parameterType);
            String resultMap = this.context.getStringAttribute("resultMap");
            String resultType = this.context.getStringAttribute("resultType");
            String lang = this.context.getStringAttribute("lang");
            LanguageDriver langDriver = this.getLanguageDriver(lang);
            Class<?> resultTypeClass = this.resolveClass(resultType);
            String resultSetType = this.context.getStringAttribute("resultSetType");
            StatementType statementType = StatementType.valueOf(this.context.getStringAttribute("statementType", StatementType.PREPARED.toString()));
            ResultSetType resultSetTypeEnum = this.resolveResultSetType(resultSetType);
            String nodeName = this.context.getNode().getNodeName();
            SqlCommandType sqlCommandType = SqlCommandType.valueOf(nodeName.toUpperCase(Locale.ENGLISH));
            boolean isSelect = sqlCommandType == SqlCommandType.SELECT;
            boolean flushCache = this.context.getBooleanAttribute("flushCache", !isSelect);
            boolean useCache = this.context.getBooleanAttribute("useCache", isSelect);
            boolean resultOrdered = this.context.getBooleanAttribute("resultOrdered", false);
            XMLIncludeTransformer includeParser = new XMLIncludeTransformer(this.configuration, this.builderAssistant);
            includeParser.applyIncludes(this.context.getNode());
            this.processSelectKeyNodes(id, parameterTypeClass, langDriver);
            SqlSource sqlSource = langDriver.createSqlSource(this.configuration, this.context, parameterTypeClass);
            String resultSets = this.context.getStringAttribute("resultSets");
            String keyProperty = this.context.getStringAttribute("keyProperty");
            String keyColumn = this.context.getStringAttribute("keyColumn");
            String keyStatementId = id + "!selectKey";
            keyStatementId = this.builderAssistant.applyCurrentNamespace(keyStatementId, true);
            Object keyGenerator;
            if (this.configuration.hasKeyGenerator(keyStatementId)) {
                keyGenerator = this.configuration.getKeyGenerator(keyStatementId);
            } else {
                keyGenerator = this.context.getBooleanAttribute("useGeneratedKeys", this.configuration.isUseGeneratedKeys() && SqlCommandType.INSERT.equals(sqlCommandType)) ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE;
            }

            this.builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass, resultSetTypeEnum, flushCache, useCache, resultOrdered, (KeyGenerator)keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);
        }
    }

Luego verifique los parámetros de depuración, mi solicitud de interfaz es selectFast (), un método normal, pero ahora también verifiqué selectTest (); este método problemático.

resultMap devuelve java.util.List

Así que busque el método selectTest globalmente, modifique los parámetros de retorno y complete la corrección del error.

Resumen : Este error no es un error complicada, ni un error significativo, ..., Pero mybatis compila y se inicia sin informar de un error Cuando se solicita una interfaz normal, se informa de un error de un método irrelevante Esta ubicación inmediata es problemático , se hacer que pierda mucho tiempo en la resolución de problemas Primero recuerde que habrá este problema, y ​​evitará un hoyo en el futuro.

 

Supongo que te gusta

Origin blog.csdn.net/Mint6/article/details/98330873
Recomendado
Clasificación