|
我正在尝试配置参数化查询以达到以下效果:6 [% l) M0 E1 R8 m6 N/ P+ O
SELECT field1 FROM myTable WHERE field2 IN (1,2,3,4)
: g" s6 ~( m4 @& Z( e/ u: o7 J$ u我正在使用的数据库是Postgres。
4 _$ e* j- R8 w! o& |此查询在未参数化的情况下成功运行,但是我想使用带有JdbcTemplate的参数化查询来填充有效的field2值(整数)列表。7 W' c4 T' V& P6 D
尝试不同的值var("1,2,3,4","[1,2,3,4]","{1,2,3,4}",或"(1,2,3,4)"上查询),我试过的变化:& W3 \6 e1 u" v9 f! o) W
myJdbcTemplate.query("SELECT field1 FROM field2 IN (?)", new Object[]{ var })1 i" j7 w- Y! ^: D- W) m
和, Z& h( g0 Q" U/ | G
myJdbcTemplate.query("SELECT field1 FROM field2 IN (?::integer[])", new Object[]{ var })
" Z. t% r7 F$ b O/ u并且
9 o" G) Q1 |( W$ e/ ^' w, I: dmyJdbcTemplate.query("SELECT field1 FROM field2 IN ?::integer[]", new Object[]{ var })! F. W6 z6 `& M; l' q y* S
附带说明,描述如何参数化查询的资源也将非常有帮助。
$ q; H8 R7 w' _) l3 v+ @: C所有这些查询都抛出PSQLExceptions,这些异常指示操作符失败或类型不匹配-这似乎很合理,因为我无法弄清楚如何对查询进行参数化。: ]* j- ]% T! @: M9 {) n" o
+ q7 \' N# Y, M1 t6 b) z% e
解决方案:, e" K; C" m$ x4 M- w
2 _' v1 }$ w- R" S1 A G+ B* x& L2 I7 K8 D f }9 f/ F: @+ [, Q# c* Q
# F' Y! p( I& c7 A2 W, A0 i
看一下Spring Data
' y E: q1 \1 n& b8 L, A" r- E0 FAccess网页,特别是第11.7.3节,其中涵盖了使用NamedParameterJdbcTemplate构建’IN’子句。
! C) S V' J& C9 N* \2 Z. n8 X. ?例如! |7 s( J: ~" q" t' U
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);+ r5 u+ h1 a) E& c+ Q# Q
String sql = "select * from emp where empno in (:ids)";
$ p }: M! Z2 p0 `List idList = new ArrayList(2);, \! S! f1 p' `: L& w) ~: ~6 T
idList.add(new Long(7782));+ ~; A l- h/ U! R6 \
idList.add(new Long(7788));
/ ~4 M) q9 R9 K0 ^6 |! u2 \- |" B X+ f2 cMap parameters = new HashMap();
- j6 e' K X0 g/ M( T9 xparameters.put("ids", idList);: p% q, a, L/ A1 L
List emps = jdbcTemplate.query(sql, parameters, new EmpMapper()); |
|