Question

Je n'ai rien pu voir dans la documentation qui parle de ma question, et lors du déploiement, mon application ne fonctionne pas tout à fait correctement (plus à ce sujet dans une seconde). J'essaye de faire quelque chose comme

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

à mybatis. J'ai un certain nombre de tables de recherche qui ont des colonnes partagées et donc l'utilisateur au niveau de la vue détermine quelle table de recherche est finalement utilisée. L'erreur que j'obtiens lorsque j'essaie d'exécuter Getlookuprows est

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)

Mon interface de mappel est la suivante:

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

Nous savons donc que j'essaie de passer une chaîne à cette requête, rien de spécial. J'ai la colonne spécifique, car ce sera ma prochaine tâche. Vraiment, l'une des colonnes de chacune des tables de recherche est unique, et je dois donc appeler la colome spécifique appropriée, mais je serais vraiment heureuse si je pouvais le paramètre du tableau et la clause From.

Était-ce utile?

La solution

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

fait l'affaire. Il y a une notation différente de l'injection réellement dans une valeur pour le nom et le tableau de la colonne, puis disent la valeur de la colonne. Si vous injectez une valeur dans une clause Where, alors la notation # est la correcte à utiliser.

Si la valeur utilisée pour la table dans cette requête n'est pas échappée, des problèmes d'injection SQL peuvent se produire. Pour mon cas d'utilisation, la DB m'a précédé et même si je peux faire ce que je veux aux parties Java et voir, je ne suis pas autorisé à modifier les structures fondamentales des tables.

Si quelqu'un veut expliquer davantage la trace de pile que j'ai obtenue (c'est-à-dire le type de pensée MyBatis), j'aimerais lire et être davantage éduqué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top