質問

ドキュメントでは、私の質問を話すものは何も見ることができませんでした。展開すると、私のアプリは正しく機能しません(詳細についてはSECで)。私はようなことをしようとしています

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

MyBatisで。列を共有するルックアップテーブルが多数あるため、ビューレベルのユーザーが最終的に使用されるルックアップテーブルを決定します。 GetSookUprowsを実行しようとすると私が得るエラーは

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つは一意です。したがって、適切な特定の列を呼び出す必要がありますが、テーブルパラメーターとFrom句が動作することができれば本当に幸せです。

役に立ちましたか?

解決

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

トリックをします。列名とテーブルの値に実際に注入することとは異なる表記があり、列の値を言います。 Where句に値を注入している場合、#表記は使用するのが正しいです。

このクエリのテーブルに使用される値が逃げられない場合、SQLインジェクションの問題が発生する可能性があります。私のユースケースのために、DBが私に先行し、Javaに必要なことを何でもできるようになり、部分を表示することはできませんが、テーブルの基本構造を変更することは許可されていません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top