带有许多args的Spring JdbcTemplate的queryForList()是不可读的; SQLQuery没有给我列表名称

时间:2013-03-05 18:26:49

标签: java spring hibernate plsql jdbctemplate

注意:这可能是一个简单的问题,但我找不到简短的说明方法。所以,抱歉这个长期的问题。

在我负责的项目中,我使用Spring 2.5,Hibernate 3.3.2作为中间件和Oracle数据库。由于数据库与许多其他项目相关,因此一些查询非常复杂,我无法通过Hibernate的解决方案(HQL,Criteria等)获得解决方案。所以我觉得JdbcTemplate的queryForX()方法更为舒服,作为一个例子;

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

当然,确实存在大多数“在哪里”的条件和参数:

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还有其他一些解决方案,如:

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

对于这种类型的查询,我们可以写它是否是Hibernate:

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

我认为它更易读,更容易理解哪个值是什么。我知道我可以用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())的映射列表的简单解决方案?

1 个答案:

答案 0 :(得分: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