注意:这可能是一个简单的问题,但我找不到简单的方法来说明它。所以,很抱歉这个长长的问题。
在我负责的一个项目中,我使用 Spring 2.5、Hibernate 3.3.2 作为中间件和 Oracle 数据库。由于数据库与许多其他项目相关,因此某些查询非常复杂,我无法使用 Hibernate 的解决方案(HQL、标准等)获得解决方案。所以我觉得 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
那么现在,哪个问号对应哪个参数?这很明显,但很难阅读。但是对于绑定参数还有其他一些解决方案,例如:
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())的映射列表的简单解决方案?