Любые вызовы с использованием jdbcTemplate.queryForList возвращают список Карт, которые имеют значения NULL для всех столбцов. Столбцы должны иметь строковые значения.jdbcTemplate.queryForList возвращает список Карта, где все значения столбца NULL
Я получаю правильное количество строк по сравнению с результатом, получаемым при выполнении того же запроса в собственном SQL-клиенте.
Я использую мост JDBC ODBC и базы данных MS SQL Server 2008.
Я следующий код в моей DAO:
public List internalCodeDescriptions(String listID) {
List rows = jdbcTemplate.queryForList("select CODE, DESCRIPTION from CODE_DESCRIPTIONS where LIST_ID=? order by sort_order asc", new Object[] {listID});
//debugcode start
try {
Connection conn1 = jdbcTemplate.getDataSource().getConnection();
Statement stat = conn1.createStatement();
boolean sok = stat.execute("select code, description from code_descriptions where list_id='TRIGGER' order by sort_order asc");
if(sok) {
ResultSet rs = stat.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
String columnname1=rsmd.getColumnName(1);
String columnname2=rsmd.getColumnName(2);
int type1 = rsmd.getColumnType(1);
int type2 = rsmd.getColumnType(2);
String tn1 = rsmd.getColumnTypeName(1);
String tn2 = rsmd.getColumnTypeName(2);
log.debug("Testquery gave resultset with:");
log.debug("Column 1 -name:" + columnname1 + " -typeID:"+type1 + " -typeName:"+tn1);
log.debug("Column 2 -name:" + columnname2 + " -typeID:"+type2 + " -typeName:"+tn2);
int i=1;
while(rs.next()) {
String cd=rs.getString(1);
String desc=rs.getString(2);
log.debug("Row #"+i+": CODE='"+cd+"' DESCRIPTION='"+desc+"'");
i++;
}
} else {
log.debug("Query execution returned false");
}
} catch(SQLException se) {
log.debug("Something went haywire in the debug code:" + se.toString());
}
log.debug("Original jdbcTemplate list result gave:");
Iterator<Map<String, Object>> it1= rows.iterator();
while(it1.hasNext()) {
Map mm = (Map)it1.next();
log.debug("Map:"+mm);
String code=(String)mm.get("CODE");
String desc=(String)mm.get("description");
log.debug("CODE:"+code+" : "+desc);
}
//debugcode end
return rows;
}
Как вы можете видеть, я добавил некоторые отладки код, чтобы отобразить результаты запросаForList, а также получить соединение из объекта jdbcTemplate и использовать его для отправки того же запроса с использованием базовых методов jdbc (listID = 'TRIGGER').
Что озадачивает меня в том, что журнал выдает что-то вроде этого: общая
Testquery gave resultset with:
Column 1 -name:code -typeID:-9 -typeName:nvarchar
Column 2 -name:decription -typeID:-9 -typeName:nvarchar
Row #1: CODE='C1' DESCRIPTION='BlodoverxF8rin eller bruk av blodprodukter'
Row #2: CODE='C2' DESCRIPTION='Kodetilfelle, hjertestans/respirasjonstans'
Row #3: CODE='C3' DESCRIPTION='Akutt dialyse'
...
Row #58: CODE='S14' DESCRIPTION='Forekomst av hvilken som helst komplikasjon'
...
Original jdbcTemplate list result gave:
Map:(CODE=null, DESCRIPTION=null)
CODE:null : null
Map:(CODE=null, DESCRIPTION=null)
CODE:null : null
...
58 повторений.
Почему результат метода queryForList возвращает NULL во всех столбцах для каждой строки? Как я могу получить результат, который я хочу использовать jdbcTemplate.queryForList?
xF8 должен быть буквой ø, поэтому у меня есть некоторые проблемы с кодировкой, но я не вижу, как это может привести ко всем значениям - также строки, не содержащие каких-либо странных букв (строка 2), чтобы превратиться в значения NULL в списке карт, возвращаемых методом jdbcTemplate.queryForList.
Тот же код отлично работает на другом сервере с базой данных MySQL Server 5.5, используя драйвер jdbc для MySQL.
Почему вы используете мост ODBC JDBC? Не могли бы вы попробовать использовать драйвер JDBC Microsoft или jTDS? –
У меня нет возможности копировать файлы на этот сервер (он находится в защищенной сети без доступа в Интернет). Я убедил системного администратора клиента скопировать драйвер jdbc MS SQL Server на сервер и действительно устранил проблему. Я не очень надеялся, что с тех пор, как я получил данные, используя «простой» jdbc-код, а не при использовании jdbcTemplate. –