#java #spring-boot #spring-jdbc
Вопрос:
У меня есть таблица в базе данных, где тип данных столбца(СТАТУС) — CLOB.Мне нужно прочитать этот СТАТУС
create table STATUS_TABLE
(
STATE_ID number(20,0),
STATUS clob
)
Я пытаюсь прочитать колонку CLOB, как показано ниже
String getStatus = "SELECT STATUS FROM STATUS_TABLE WHERE STATE_ID=" id;
Query statusResults = session.createSQLQuery(getStatus);
List statusRes = statusResults.list();
if ((statusRes != null) amp;amp; (statusRes.size() > 0)) {
oracle.sql.CLOB clobValue = (oracle.sql.CLOB) statusRes.get(0);
status = clobValue.getSubString(1, (int) clobValue.length());
log.info("Status->:" status.toString());
}
И получаю ошибку в виде
java.lang.ClassCastException: $Proxy194 cannot be cast to oracle.sql.CLOB
Как я могу прочитать данные clob из БД и преобразовать их в строку ?
Комментарии:
1. какие данные вы пытаетесь сохранить ?? почему вы используете CLOB ?
2. Я бы подумал использовать PreparedStatement -> Набор результатов, а затем использовать > docs.oracle.com/javase/7/docs/api/java/sql/… было бы лучше
3. Также в вашей таблице указано
STATUS
, но ваш SQL говоритSELECT STATUS_DESCRIPTION
Ответ №1:
Вот исправленная версия, и под кодом появляется объяснение:
Query query = session.createSQLQuery("SELECT STATUS FROM STATUS_TABLE WHERE STATE_ID = :param1");
query.setInt("param1", id);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List statusRes = query.list();
if (statusRes != null) {
for (Object object : statusRes) {
Map row = (Map)object;
java.sql.Clob clobValue = (java.sql.Clob) row.get("STATUS");
status = clobValue.getSubString(1, (int) clobValue.length());
log.info("Status->:" status.toString());
}
}
Проблемы, которые я видел с вашим кодом:
- Вы создавали необработанную строку запроса с помощью объединения. Это делает вас уязвимыми для SQL-инъекций и других плохих вещей.
- По какой бы причине вы ни пытались разыграть этот КОМОК
oracle.sql.CLOB
. AFAIK JDBC вернетjava.sql.Clob
- Вы выполняете собственный запрос Hibernate, который вернет набор результатов списка, тип которого неизвестен во время компиляции. Таким образом, каждый элемент в списке представляет одну запись.