2014-08-29 38 views
0

我無法理解它有什麼問題,我花了很多時間試圖從方法queryForList(..)中獲取我的String對象,並且都是不需要的。所以這裏這個愚蠢的SQL查詢:帶參數的彈簧JdbcTemplate返回空列表

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<String> email = jdbcTemplate.queryForList(GET_EMAIL_BY_LDAP, new Object[]{userId.toUpperCase()}, String.class); 

附: getEmailById(「DN270391RKA」) - 這是我傳遞的用戶ID參數。它沒有空格。在表ld.LDAP_EMAIL1領域

類型是:NVARCHAR2(381 CHAR)

+0

DB中是否有'ldap_login'和'ldap_email1'字符串?如果您將用戶標識「硬編碼」到SQL查詢中,您會得到結果嗎? – icza 2014-08-29 11:17:34

+0

「我也試過這個也沒有'?'參數,它是完美的。「通過這個句子我的意思是我已經嘗試了硬編碼參數,它的工作原理。 – 2014-08-29 11:19:30

+0

我的意思是「硬編碼」一個用戶ID,例如:''select ... FROM ... WHERE ld.ldap_login ='exampleUserId'「' – icza 2014-08-29 11:20:30

回答

0

我已經明白它是什麼!

我的(legacy: - D)表中的ld.ldap_login值有一個尾部空格。小的編輯我的SQL語句後,它的作品。我只在這一列添加了TRIM()。

「從IPS.ldap ld中選擇ld.LDAP_EMAIL1其中TRIM(ld.ldap_login)=?」

因此,看起來如果它是通常的sql語句,那麼當我執行查詢時,然後oracle數據庫自動執行TRIM()並且PreparedStatement不會。

0
List<String> email = jdbcTemplate.queryForList(GET_EMAIL_BY_LDAP, String.class, userId.toUpperCase()); 

這條線是完全正確的,因此似乎無論是不好的用戶ID或您的SQL查詢是不正確的。

最好的方法是在查詢瀏覽器中將您的sql查詢與現有用戶標識粘貼,並檢查是否得到的不僅僅是空的結果。

然後再次使用jdbc模板並傳遞硬編碼的以前工作的用戶標識並檢查是否得到相同的結果。

或者:刪除userid子句並選擇全部不特定於用戶標識。

同時確保ld.LDAP_EMAIL是String表示e.g VARCHAR /文字

+0

當我在Oracle SQL開發人員中執行查詢時,它可以工作。當我使用硬編碼的查詢(沒有?參數)它的作品。當我使用上面的代碼時,它不起作用... aaaaahhh%^#$#$$# – 2014-08-29 12:23:51