Как прочитать столбец CLOB в базе данных Oracle с Java

#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, который вернет набор результатов списка, тип которого неизвестен во время компиляции. Таким образом, каждый элемент в списке представляет одну запись.