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

Java 使用带有MemSql的JPA本机查询选择json列,java,spring,jpa,singlestore,Java,Spring,Jpa,Singlestore,我在MemSql数据库中有一个表,其中包含类型为JSON的列 我正在尝试执行以下查询 select tweet from tweets_json; tweet列是JSON列 下面是我用来执行这个查询的代码 public List<String> getTweets(){ Query q = entityManager.createNativeQuery("select tweet from tweets_json"); List<String> resu

我在
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();
}
public List getTweets(){
Query q=entityManager.createNativeQuery(“从tweets_json中选择tweet”);
List resultList=query.getResultList();
}
我希望结果是一个字符串列表,每个字符串代表JSON

问题是我将字符串转换为单个
字符
对象,该对象只包含JSON
{
的第一个字符

无论我使用的列表项的类型如何,结果始终是一个带有开放式花括号符号的字符列表

我尝试使用
List
List
List
List
,所有这些都返回了相同的结果

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


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

您需要使用JSON\u EXTRACT\u STRING函数

select JSON_EXTRACT_STRING(tweet,0) from tweets_json;
确切的功能定义是:

JSON_EXTRACT_<type>(json, keypath)
JSON\u EXTRACT\u(JSON,keypath)
您可以在此处找到示例:

这里呢


关于使用
EntityManager
/
HibernateSession
的常见情况,我将建议一种替代方法-您可以将列作为字符串检索,因此不需要Hibernate来理解JSON:

Query q = entityManager.createNativeQuery("select tweet :> text from tweets_json");
这是将JSON字段类型转换为
text
,一种字符串数据类型(您也可以根据需要使用varchar或其他任何类型)


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

这就是我的答案

在用于类型转换json的本机sql查询中使用
CAST(tweet作为CHAR(1000))

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

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

这里有一个类似的问题,可能会对您有很大帮助。您用MemSQL标记了您的问题,但只提到了MemSQL。如果您不使用MySQL,则应该删除该标记。添加json用户类型(如此处所述)解决了我的问题。