Java Spring JdbcTemplate';具有多个参数的s queryForList()不可读;sqlquerydon';不要给我列有列名的列表

Java Spring JdbcTemplate';具有多个参数的s queryForList()不可读;sqlquerydon';不要给我列有列名的列表,java,spring,hibernate,plsql,jdbctemplate,Java,Spring,Hibernate,Plsql,Jdbctemplate,注意:这可能是一个简单的问题,但我找不到一个简单的方法来说明。所以,很抱歉问了这么长的问题 在我负责的一个项目中,我使用Spring2.5、Hibernate3.3.2作为中间件和Oracle数据库。由于数据库与许多其他项目相关,一些查询非常复杂,我无法使用Hibernate的解决方案(HQL、Criteria等)获得解决方案。例如,我觉得使用JdbcTemplate的queryForX()方法更合适 String sql = "select * from myTable"; jdbc.quer

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

在我负责的一个项目中,我使用Spring2.5、Hibernate3.3.2作为中间件和Oracle数据库。由于数据库与许多其他项目相关,一些查询非常复杂,我无法使用Hibernate的解决方案(HQL、Criteria等)获得解决方案。例如,我觉得使用JdbcTemplate的queryForX()方法更合适

String sql = "select * from myTable";
jdbc.queryForList(sql);
当然,确实存在大多数“where”条件和参数:

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
那么现在,哪个问号代表哪个参数?这很明显,但很难理解。但对于绑定参数,还有其他一些解决方案,如:

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())来映射列表?

您可以使用它来实现这一点

这是样品

    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);
您可以在下面的链接中使用源代码检查完整的示例

你可以用它来做这件事

这是样品

    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的MapSqlParameterSource设置参数更简洁。它通过允许namedParameters.put(“forumName”,forum.getForumName(),String.class)来支持数据类型;谢谢@ninn,我也检查过了,我想对你的代码做一点修改。我正在编辑您添加的实际答案。非常感谢,我会尝试一下!注意:使用Spring的MapSqlParameterSource设置参数更简洁。它通过允许namedParameters.put(“forumName”,forum.getForumName(),String.class)来支持数据类型;谢谢@ninn,我也检查过了,我想对你的代码做一点修改。我正在编辑您添加的实际答案。