2010-05-31 320 views
1

我有一個Spring JdbcTemplate替換參數的問題。使用Spring JDBCTemplate在查詢中動態選擇字段名稱

我有這個疑問:

<bean id="fixQuery" class="java.lang.String"> 
    <constructor-arg type="java.lang.String" 
     value="select fa.id, fi.? from fix_ambulation fa 
       left join fix_i18n fi 
       on fa.translation_id = fi.id order by name" /> 

而且這種方法:

public List<FixAmbulation> readFixAmbulation(String locale) throws Exception { 
    List<FixAmbulation> ambulations = this.getJdbcTemplate().query(
      fixQuery, new Object[] {locale.toLowerCase()}, 
      ParameterizedBeanPropertyRowMapper 
        .newInstance(FixAmbulation.class)); 
    return ambulations; 
} 

我想有?填充表示用戶正在使用的語言環境的字符串。所以如果用戶是巴西人,我會給他發一張fix_i18n表中的pt_br列,否則如果他是美國人,我會給他發一列en_us。

我從這個方法得到的是一個PostgreSQL例外org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

如果我更換網絡連接?只有(語言環境的列名是唯一的,所以如果我在數據庫中運行此查詢,它工作得很好)我得到的是,從方法返回的每個對象都將字符串區域設置放入字段名稱中。即在名稱字段中我有「en_us」。

只有這樣,纔能有工作,我發現是改變方法爲:

public List<FixAmbulation> readFixAmbulation(String locale) throws Exception { 
    String query = "select fa.id, fi." + locale.toLowerCase() + " as name " + fixQuery; 
    this.log.info("QUERY : " + query); 
    List<FixAmbulation> ambulations = this.getJdbcTemplate().query(
      query, 
      ParameterizedBeanPropertyRowMapper 
        .newInstance(FixAmbulation.class)); 
    return ambulations; 
} 

和設置fixQuery到:

<bean id="fixQuery" class="java.lang.String"> 
    <constructor-arg type="java.lang.String" 
     value=" from telemedicina.fix_ambulation fa 
       left join telemedicina.fix_i18n fi 
       on fa.translation_id = fi.id order by name" /> 
</bean> 

吾道延伸春JdbcDaoSupport和工作得很好,所有的其他查詢。我究竟做錯了什麼?

回答

0

我不認爲你應該發送任何人的專欄信息。這是持久層級的東西,不應該泄漏出去。

如果您想要一個特定於語言環境的視圖,請使用Spring工具來執行此類操作。它與你如何堅持數據沒有任何關係。

+0

你可以看到它只是發送語言環境名稱,以接收正確的數據。無論如何,dao是從blazeds實例中調用的,爲flex應用程序獲取數據。 但問題不在於區域設置或列信息。這只是關於如何讓一個動態列名取代「?」在查詢中(在這種情況下,它從視圖層發送,但它並不重要)。 – Francesco 2010-06-01 10:24:59