2

私の質問を説明するドキュメントには何も表示されていません。それをデプロイすると、私のアプリは完全に機能しません(これについては後ほど詳しく説明します)。私は次のようなことをしようとしています

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

MyBatisで。列を共有するルックアップテーブルがいくつかあるため、ビューレベルのユーザーが、最終的に使用されるルックアップテーブルを決定します。getLookupRowsを実行しようとするとエラーが発生します

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)

私のマッパーインターフェースは次のとおりです。

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

したがって、このクエリに文字列を渡そうとしていることがわかります。特別なことは何もありません。次のタスクになるので、特定の列があります。実際には、各ルックアップテーブルの列の1つが一意であるため、適切なspecificColumnを呼び出す必要がありますが、テーブルパラメーターとFROM句が機能するようになれば本当に嬉しいです。

4

1 に答える 1

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

トリックを行います。列名とテーブルの値を実際に挿入してから列の値を指定するのとは異なる表記法があります。where句に値を挿入する場合は、#表記が正しい使用法です。

このクエリのテーブルに使用される値がエスケープされていない場合、SQLインジェクションの問題が発生する可能性があります。私のユースケースでは、DBが私の前にあり、JavaとViewの部分に対してやりたいことは何でもできますが、テーブルの基本的な構造を変更することは許可されていません。

誰かが私が得たスタックトレース(つまり、myBatisの思考テーブルのタイプ)をさらに説明したい場合は、読んでさらに教育を受けたいと思います。

于 2011-06-15T12:47:04.803 に答える