Выберите столбец json, используя собственный запрос JPA с MemSql - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть таблица в базе данных MemSql, которая содержит столбец типа JSON.

Я пытаюсь выполнить следующий запрос.

select tweet from tweets_json;

Столбец tweet является столбцом JSON.

Вот код, который я использую для выполнения этого запроса.

public List<String> getTweets(){
    Query q = entityManager.createNativeQuery("select tweet from tweets_json");
    List<String> resultList = query.getResultList();
}

Я ожидаю, что результатом будет список строк, и каждая строка будет представлять JSON.

Проблема в том, что я получаю строку, преобразованную в один Character объект, который содержит только первый символ JSON {.

Результатом всегда является список символов с символом открытой фигурной скобки независимо от типа используемого элемента списка.

Я пытался использовать List<Object[]>, List<String[]>, List<Object>, List<JsonElement> и все получать один и тот же результат.

Я даже пытался не указывать тип элементов списка и возвращать только список, а результат все тот же.

Как я могу получить весь JSON и какова основная причина этой проблемы?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Я предложу альтернативный подход - вы можете извлечь столбец в виде строки и, таким образом, не нуждаетесь в Hibernate, чтобы что-то понять о JSON:

Query q = entityManager.createNativeQuery("select tweet :> text from tweets_json");

Это типизация поля JSON для text, типа данных строки (вы также можете использовать varchar или что-то еще, если необходимо).

Возвращенный результат в любом случае одинаков (просто строка), но в этом случае Hibernate должен понимать, что это строка.

0 голосов
/ 19 февраля 2019

Вот что у меня получилось.

Используйте CAST(tweet as CHAR(1000)) в собственном SQL-запросе для типизации json

Query q = entityManager.createNativeQuery("select CAST(tweet as CHAR(1000)) from tweets_json");

Это вернет вам массив char[], который может быть приведен к String и может использоваться в дальнейшем.

0 голосов
/ 14 февраля 2019

Вам необходимо использовать функцию JSON_EXTRACT_STRING.

select JSON_EXTRACT_STRING(tweet,0) from tweets_json;

Точное определение функции:

JSON_EXTRACT_<type>(json, keypath)

Вы можете найти примеры здесь: https://docs.memsql.com/sql-reference/v6.7/json_extract_type/

и здесь

Чтение JSON из MEMSQL

Что касается общего случая, когда используется EntityManager / HibernateSession, тип пользователя является обязательным https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/

...