Domanda

Non sono stato in grado di vedere nulla nella documentazione che parla alla mia domanda e dopo averla distribuita, la mia app non funziona bene (ne parleremo più su una SEC). Sto cercando di fare qualcosa di simile

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

in mybatis. Ho un numero di tabelle di ricerca che hanno colonne condivise e quindi l'utente a livello di vista determina quale tabella di ricerca viene infine utilizzata. L'errore che ricevo quando provo a eseguire 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)

La mia interfaccia mapper è la seguente:

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

Quindi sappiamo che sto cercando di passare una corda a questa query, niente di speciale. Ho la colonna specifica, perché quella sarà la mia prossima attività. Davvero una delle colonne di ciascuna delle tabelle di ricerca è unica e quindi devo chiamare la colonna specifica appropriata, ma sarei davvero felice se potessi il parametro della tabella e la clausola da funzionamento.

È stato utile?

Soluzione

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

fa il trucco. Esiste una notazione diversa dall'iniezione effettiva in un valore per il nome della colonna e la tabella, quindi dire il valore della colonna. Se stai iniettando un valore in una clausola dove, allora la notazione # è la corretta da utilizzare.

Se il valore utilizzato per la tabella in questa query non viene sfuggito, possono verificarsi problemi di iniezione di SQL. Per il mio caso d'uso, il DB mi ha preceduto e mentre posso fare quello che voglio alle porzioni di Java e visualizzare, non mi è permesso di modificare le strutture fondamentali delle tabelle.

Se qualcuno vuole spiegare ulteriormente la traccia dello stack che ho ottenuto (cioè che tipo di pensiero di Mybatis fosse), mi piacerebbe leggere ed essere ulteriormente educato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top