使用带有MemSql的JPA本机查询选择json列

时间:2018-11-01 08:09:41

标签: java spring jpa memsql

我在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>,所有结果都相同。

我什至尝试不指定列表元素的类型,而只返回一个List,结果仍然相同。

如何获取整个JSON,此问题的根本原因是什么?

3 个答案:

答案 0 :(得分:1)

这对我有用。

在本机sql查询中使用CAST(tweet as CHAR(1000))进行json的类型转换

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

这将返回char[]个数组,该数组可以转换为String,并可以进一步使用。

答案 1 :(得分:0)

您需要使用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/

在这里

Reading JSON from MEMSQL

对于使用EntityManager / HibernateSession的常见情况,用户类型为必要https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/

答案 2 :(得分:0)

我将建议一种替代方法-您可以将列作为字符串检索,因此不需要Hibernate来了解有关JSON的任何信息:

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

这是将JSON字段强制转换为字符串数据类型text(您也可以根据需要使用varchar或其他任何类型)。

两种方法返回的结果都是相同的(只是一个字符串),但是通过这种方式,Hibernate应该能够理解它是一个字符串。