2013-03-05 42 views
2

注意:這可能是一個簡單的問題,但我找不到一個簡短的方法說清楚。所以,對於這個很長的問題感到抱歉帶有許多參數的Spring JdbcTemplate的queryForList()不可讀; SQLQuery不給我列名稱列表

在我負責的項目中,我使用Spring 2.5,Hibernate 3.3.2作爲中間件和Oracle數據庫。由於數據庫與許多其他項目相關,一些查詢非常複雜,我無法獲得Hibernate解決方案(HQL,Criteria等)的解決方案。所以我對JdbcTemplate的queryForX()方法感到更加舒適,例如;

String sql = "select * from myTable"; 
jdbc.queryForList(sql); 

當然大多有 「裏」 的條件,而params確實是: 「?」

jdbc.querForList(sql, new Object[]{obj1,obj2,obj3 /* and many more arguments... */}) 

在這種情況下,我必須寫問號對於我的參數,所以我的SQL查詢字符串變得雜亂而難以閱讀;這樣的事情:

select t1.col1, t2.col2, t1.col, --...some cols , 
    sum(nvl(some_col1,?)-nvl(other_col2,?)) over (partition by col1,col2,col3,col4) sum_of_cols 
from weird_table t1, another_table t2 
where t1.col20=? and sum_of_cols>? and t1.col3=t2.col3 --and many ?'s... 
and not exists (
    select ? from boring_table t3 where -- many ?'s 
) 
--group by and order by order by etc 

所以,現在,哪個問號是哪個參數?這顯而易見但很難閱讀。但也有綁定PARAMS像一些其他的解決方案:

Query q = hibernateTemplate.createQuery(); 
q.setString("col1","a value"); 
q.setInteger("col2", 3); 

我認爲這是更具可讀性和易於理解其價值:

select * from a_table t where t.col1= :col1 and t.col2= :col2 -- and many more ":param"s 

對於這種類型的查詢,如果它是休眠,我們可以寫是什麼。我知道我可以用SQLQuery做到這一點;

SQLQuery sq = hibernateTemplate.createSQLQuery(); 
/* same as above setInteger() etc. */ 

但是這個sq.list()給了我一個沒有列名的列表。所以我必須使用的基本排列是困難的:

[[1,2,"a"],[1,2,"b"], ...] 

但隨着queryForList()我得到更好的一個:

[{COL1=1,COL2=2,COL3="a"},{COL1=1,COL2=2,COL3="b"},...] 

所以,如果我用queryForList(),我必須寫一個很凌亂params對象; 或我使用SQLQuery然後我必須得到我的列表沒有地圖列名稱。

是否有一個使用更多可讀參數設置(如query.setX())的映射列表的簡單解決方案?

回答

3

那麼你可以使用NamedParameterJdbcTemplate做到這一點

繼承人樣品

String query = "INSERT INTO FORUMS (FORUM_ID, FORUM_NAME, FORUM_DESC) 
VALUES (:forumId,:forumName,:forumDesc)"; 
    Map namedParameters = new HashMap(); 
    namedParameters.put("forumId", Integer.valueOf(forum.getForumId())); 
    namedParameters.put("forumName", forum.getForumName()); 
    namedParameters.put("forumDesc", forum.getForumDesc()); 
    namedParameterJdbcTemplate.update(query, namedParameters); 

你的源代碼檢查以下鏈接

Spring NamedParameterJdbcTemplate Tutorial

+0

謝謝完整的示例非常感謝,我會試一試! – 2013-03-05 19:58:21

+0

注意:使用Spring的MapSqlParameterSource來設置參數更爲簡單。它通過允許namedParameters.put(「forumName」,forum.getForumName(),String.class)爲數據類型提供支持。 – ninnemannk 2013-03-05 20:07:23

+0

謝謝@ninn,我也檢查過了,我想對你的代碼做一點修正。我正在編輯實際答案與您的添加。 – 2013-03-06 15:42:56