Pregunta

No he podido ver nada en la documentación que hable de mi pregunta, y al implementarla, mi aplicación no funciona bien (más sobre eso en un segundo). Estoy tratando de hacer algo como

<select id="getLookupRows" parameterType="map" resultMap="lookupMap">
   select id, name, active, valid
   from #{table}
</select>

en mybatis. Tengo una serie de tablas de búsqueda que tienen columnas compartidas, por lo que el usuario en el nivel de vista determina qué tabla de búsqueda se usa finalmente. El error que recibo cuando intento ejecutar getLookUprows es

Cause: org.apache.ibatis.executor.ExecutorException: There was no TypeHandler found for parameter table of statement info.pureshasta.mapper.LookupMapper.getLookupRows
org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:77)
org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:69)
org.apache.ibatis.binding.MapperMethod.executeForList(MapperMethod.java:85)
org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:65)
org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:38)
$Proxy15.getLookupRows(Unknown Source)
info.pureshasta.service.FieldTitleService.getLookupRows(FieldTitleService.java:33)

Mi interfaz mapper es la siguiente:

List<Lookup> getLookupRows(@Param("specificColumn") String specificColumn, 
                           @Param("table") String table);

Entonces sabemos que estoy tratando de pasar una cadena a esta consulta, nada especial. Tengo la columna específica, porque esa será mi próxima tarea. Realmente una de las columnas de cada una de las tablas de búsqueda es única, por lo que tengo que llamar a la COCOPRESA ESPECÍCULA apropiada, pero estaría muy contento si pudiera el parámetro de la tabla y el funcionamiento de la cláusula.

¿Fue útil?

Solución

<select id="getLookupRows" parameterType="map" resultMap="lookupMap">
   select id, name, active, valid
   from ${table}
</select>

Hace el truco. Hay una notación diferente de inyectar realmente en un valor para el nombre y la tabla de la columna y luego decir el valor de la columna. Si está inyectando un valor en una cláusula Where, entonces la notación # es la correcta de usar.

Si el valor utilizado para la tabla en esta consulta no se escapa, entonces pueden ocurrir problemas de inyección SQL. Para mi caso de uso, el DB me precedió y, aunque puedo hacer lo que quiera a Java y ver porciones, no se me permite alterar las estructuras fundamentales de las tablas.

Si alguien quiere explicar aún más el rastro de la pila que obtuve (es decir, qué tipo era la mesa de pensamiento mybatis) me encantaría leer y ser educado más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top