我无法理解它有什么问题,我花了很多时间尝试从方法queryForList(..)获取我的String对象,并且一无所获。所以在这里这个愚蠢的SQL查询:
String GET_EMAIL_BY_LDAP = "select ld.LDAP_EMAIL1 from IPS.ldap ld where ld.ldap_login = ?"
我也试过这个没有'?'参数,它是完美的。
以下是我使用该方法的方法:
List<String> email = jdbcTemplate.queryForList(GET_EMAIL_BY_LDAP, String.class, userId.toUpperCase());
此版本的方法也返回空List:
List<String> email = jdbcTemplate.queryForList(GET_EMAIL_BY_LDAP, new Object[]{userId.toUpperCase()}, String.class);
P.S。 getEmailById(“DN270391RKA”) - 这是我传递的用户id参数。它没有空格。
表中的ld.LDAP_EMAIL1字段类型为:NVARCHAR2(381 CHAR)
答案 0 :(得分:1)
我明白这是什么!
ld.ldap_login我的(legacy:-D)表中的值有一个拖尾空格。经过对我的sql语句的轻微编辑后,它可以工作。我刚刚在这个专栏上添加了TRIM()。
&#34;从IPS.ldap ld中选择ld.LDAP_EMAIL1,其中TRIM(ld.ldap_login)=?&#34;
所以,似乎它是通常的sql语句然后当我执行查询时,oracle数据库自动执行TRIM(),并且在PreparedStatement的情况下不执行。
答案 1 :(得分:0)
List<String> email = jdbcTemplate.queryForList(GET_EMAIL_BY_LDAP, String.class, userId.toUpperCase());
此行完全正确,因此它似乎是一个错误的userID或您的SQL查询不正确。
最好的方法是在查询浏览器中使用现有用户ID粘贴sql查询,并检查是否获得的结果为空。
然后再次使用jdbc模板并传递硬编码的先前工作用户ID,并检查是否得到相同的结果。
或:删除userid子句并选择所有不特定于用户ID的子句。
还要确保ld.LDAP_EMAIL是字符串表示形式,例如varchar / text