Не удалось прочитать результаты SQL-запроса Spring-boot - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь прочитать данные, извлеченные из базы данных, используя следующий запрос из интерфейса репозитория:

public interface EventObjectRepository extends CrudRepository<EventObject, Long> {
    @Query(value = "select tb.content from table0 tb where tb.id=:id", nativeQuery = true)
    List<String> find(@Param("id") Long id);
}

Ниже приведен пример снимка результатов, полученных из этого запроса, который сохраняетсяв список Java: List<String> results

[clob1: '{"identity":0,"original_text":"some text","rowid":2}', clob2: '{"identity":2,"original_text":"some text","rowid":3}', clob3: '{"identity":3,"original_text":"some text","rowid":4}', clob4: '{"identity":4,"product.name":"some name","original_text":"some text","commodity.name":"some name","rowid":5}']

Однако, когда я пытался получить доступ к содержимому списка, используя, например:

results.get(1)

Я получил следующую ошибку:

[ERROR] 2018-10-22 13:44:45.113 [http-nio-8090-exec-1] [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.Cla
ssCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String] with root cause
java.lang.ClassCastException: com.sun.proxy.$Proxy164 cannot be cast to java.lang.String

Что я должен сделать правильно, чтобы получить строку результата?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

если я не ошибаюсь, вы пытаетесь получить доступ к первому объекту из всего списка, для чего вам нужно получить все данные, поступающие в список, а затем попытаться получить (индексировать) из списка.

Например: List listEmp = empRepository.findAll (). Get

0 голосов
/ 22 октября 2018

Я наконец заставил его работать с помощью CLOB.

Первое, что я сделал, это изменил String на CLOB внутри определения класса следующим образом:

@Column(columnDefinition="text")
@Lob
private String content;

Byдобавив @Lob, строка будет сохранена в CLOB внутри БД, как предлагается в посте здесь .Затем для извлечения данных запрос к репозиторию вернет список CLOB, как показано ниже:

public interface EventObjectRepository extends CrudRepository<EventObject, Long> {
    @Query(value = "select tb.content from table0 tb where tb.id=:id", nativeQuery = true)
    List<Clob> find(@Param("id") Long id);
}

После получения данных в список CLOB мне нужно преобразовать каждый CLOB в строку, используя InputStream иIOUtils.Например, чтобы получить один элемент из списка:

InputStream stream = results.get(1).getAsciiStream();
StringWriter w = new StringWriter();
IOUtils.copy(stream, w);
String sample = w.toString();
0 голосов
/ 22 октября 2018

Перед присвоением results.get(1) String variable вы можете проверить тип данных в списке с помощью results.get(1).getClass(), а затем попытаться присвоить результат соответствующему типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...