Frage

Ich konnte nichts in der Dokumentation sehen, was zu meiner Frage spricht, und nach dem Bereitstellen funktioniert meine App nicht ganz richtig (mehr dazu in einer Sec.). Ich versuche so etwas wie zu tun

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

in mybatis. Ich habe eine Reihe von Nachschlagetabellen, die Spalten geteilt haben, und so bestimmt der Benutzer auf der Ansichtsebene, welche Nachschlagtabelle letztendlich verwendet wird. Der Fehler, den ich bekomme, wenn ich versuche, GetLookuProws auszuführen, ist

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)

Meine Mapper -Schnittstelle lautet wie folgt:

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

Wir wissen also, dass ich versuche, eine Zeichenfolge an diese Frage zu übergeben, nichts Besonderes. Ich habe die spezifische Spalte, denn das wird meine nächste Aufgabe sein. Wirklich eine der Spalten der einzelnen Suchtabellen sind einzigartig, und deshalb muss ich den entsprechenden Spezifikum anrufen, aber ich wäre wirklich glücklich, wenn ich den Tabellenparameter und die From -Klausel funktionieren könnte.

War es hilfreich?

Lösung

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

macht den Trick. Es gibt eine andere Notation als tatsächlich in einen Wert für den Spaltennamen und die Tabelle injiziert und dann den Spaltenwert sagen. Wenn Sie einen Wert in eine WO -Klausel injizieren, ist die # Notation die richtige zu verwenden.

Wenn der für die Tabelle in dieser Abfrage verwendete Wert nicht entkommen ist, können SQL -Injektionsprobleme auftreten. Für meinen Anwendungsfall ging mir die DB voraus und während ich dem Java, was ich will, tun kann und Teile anzeigen kann, darf ich die grundlegenden Strukturen der Tabellen nicht verändern.

Wenn jemand die Stapelspur weiter erklären möchte, die ich bekam (dh welcher Typ MyBatis -Gedankentisch) würde ich gerne lesen und weiter ausgebildet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top