我有下面的表格:
create table INTERNATIONALIZATION (
ID number not null unique,
LANG char(2) not null,
EXT_ID number not null,
EXT_COLUMN char(32) not null,
EXT_NAME char(32) not null,
TRANS_VAL nvarchar2(512) not null
);下面的代码旨在从中检索一个且只有一个结果(我100%确定该记录存在)。
public Optional<String> getTranslation(long idSkill, Locale lang, String extColumn, String extName) {
try {
return Optional.of(jdbcTemplate.queryForObject("select TRANS_VAL from INTERNATIONALIZATION where ext_id = ? and lang = ? and ext_column = ? and ext_name = ?", String.class, idSkill, lang.toLanguageTag(), extColumn, extName));
} catch (IncorrectResultSizeDataAccessException ex) {
return Optional.empty();
}
}问题是当我总是在抛出IncorrectResultSizeDataAccessException时得到Optional.empty(),因为没有找到任何记录。
当我在Oracle sql Developer中执行这个SQL查询时,我得到了正确的结果。
导致此问题的原因是什么?它可能与所需列的nvarchar2类型有关吗?
发布于 2014-12-17 22:01:29
您可能需要验证传递给查询的参数。它们可能与您在Oracle SQL Developer中使用的不同。
对于调试,当您捕获异常时,打印所使用的值。
try {
return Optional.of(jdbcTemplate.queryForObject("select TRANS_VAL from INTERNATIONALIZATION where ext_id = ? and lang = ? and ext_column = ? and ext_name = ?", String.class, idSkill, lang.toLanguageTag(), extColumn, extName));
} catch (IncorrectResultSizeDataAccessException ex) {
return Optional.empty();
// print idSkill, lang.toLanguageTag(), extColumn, extName here
}此外,当您使用CHAR列时,您必须注意比较时填充的空格。由于您正在使用绑定变量,因此在比较字符和varchars时可能会出现问题。
已创建测试表:
SQL> create table t1 (c1 char(5)); Table created.
SQL> insert into t1 values ('A');
1 row created.
SQL> commit;
Commit complete.与字面量相比,没有问题:
SQL> select count(*) from t1 where c1 = 'A';
COUNT(*)
----------
1
SQL> select count(*) from t1 where c1 = 'A ';
COUNT(*)
----------
1因为c1是一个char列,所以数据被填充到左边:
SQL> select '<'|| c1 || '>' from t1;
'<'||C1
-------
<A >与varchar2绑定变量进行比较时
SQL> var s varchar2(5)
SQL> exec :s := 'A' ;
PL/SQL procedure successfully completed.
SQL> select count(*) from t1 where c1 = :s;
COUNT(*)
----------
0数据必须相等(5个字符-一个字母,4个空格):
SQL> exec :s :='A '
PL/SQL procedure successfully completed.
SQL> select count(*) from t1 where c1 = :s;
COUNT(*)
----------
1这只是一个技巧,但我认为您最好使用varchar2列:
create table INTERNATIONALIZATION (
ID number not null unique,
LANG varchar2(2) not null,
EXT_ID number not null,
EXT_COLUMN varchar2(32) not null,
EXT_NAME varchar2(32) not null,
TRANS_VAL nvarchar2(512) not null
);https://stackoverflow.com/questions/27525356
复制相似问题