2011-06-14 37 views
2

我一直沒能看到任何其中提到我的問題,並在部署它的文檔中,我的應用程序不會(在幾秒鐘之更上)不完全工作的權利。我正在嘗試類似於設置經由參數子句中的MyBatis

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

in 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); 

,所以我們知道,我想一個字符串傳遞給該查詢,沒什麼特別的。我有特定的專欄,因爲那將是我的下一個任務。真的每個查找表中的列之一是獨一無二的,所以我必須調用相應的specificColumn,但如果我可以在表中參數和FROM子句工作,我會很高興。

回答

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

有竅門。實際上爲列名和表中的值注入了不同的符號,然後再說列值。如果你在where子句中注入一個值,那麼#符號是正確的。

如果在此查詢使用表中的值不會再逃跑可能會出現SQL注入問題。對於我的使用情況下,DB之前我,雖然我可以做任何我想要的Java和查看的部分,我不能改變表的基本結構。

如果有人想進一步解釋我得到的堆棧跟蹤(即什麼類型的myBatis思想表),我希望閱讀並進一步教育。

+1

我想只需添加1個更多的澄清。我提到了根據表格的動態列名稱specificColumn。該查詢將被更好地寫成'選擇$ {} specificColumn如SC,ID,姓名,活動,valid'等。這允許我們在結果映射中引用特定列,比如''沒有這個別名,看起來你不能引用resultMap中的特定列。 – demongolem 2011-06-15 13:37:33