使用Phoenix JDBC带参数LIKE查询遇TypeMismatchException错误求助
解决Phoenix LIKE参数查询的TypeMismatchException问题
我之前在使用Phoenix 4.10.0搭配HBase 1.2的时候,也碰到过完全一样的问题!当用JdbcTemplate做参数化LIKE查询时就会抛出TypeMismatchException: ERROR 203 (22005): Type mismatch. BOOLEAN for null,但直接把匹配内容写死在SQL里就一切正常。
问题原因
这个问题其实是Phoenix QueryServer客户端在参数绑定阶段的类型推断bug:当使用参数传递LIKE的匹配值时,客户端错误地将参数类型推断为BOOLEAN,而不是VARCHAR,和表中CUSTOMER_FULL_NAME的字符串类型不匹配,从而触发了类型错误。
解决方案
最简单的修复方式是显式指定参数的SQL类型,让JdbcTemplate明确知道这个参数是字符串类型,避免错误的类型推断。修改你的代码如下:
phoenixJdbcTemplate.queryForMap( "SELECT COUNT(*) AS totalRecord From DEV.CUSTOMER WHERE CUSTOMER_FULL_NAME LIKE ?", new Object[]{"%CUSTOMER"}, new int[]{java.sql.Types.VARCHAR} );
其他可选方案
如果你不想指定参数类型,也可以尝试在SQL中对参数做显式的类型转换,比如用CAST(? AS VARCHAR):
phoenixJdbcTemplate.queryForMap( "SELECT COUNT(*) AS totalRecord From DEV.CUSTOMER WHERE CUSTOMER_FULL_NAME LIKE CAST(? AS VARCHAR)", new Object[]{"%CUSTOMER"} );
不过第一种显式指定参数类型的方法更直接,也更符合JDBC的最佳实践。
内容的提问来源于stack exchange,提问作者Johanes Anggara
相关产品推荐
相关产品推荐

