【问题标题】:Select json column using JPA native query with MemSql使用 JPA 本机查询和 MemSql 选择 json 列
【发布时间】:2018-11-01 08:09:40
【问题描述】:

我在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&lt;Object[]&gt;List&lt;String[]&gt;List&lt;Object&gt;List&lt;JsonElement&gt; 并且都返回相同的结果。

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

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

【问题讨论】:

  • 这里有一个类似的问题Store Retrieve Json data 可能对你有很大帮助。
  • 你用mysql标记了你的问题,但你只提到了MemSQL。如果您不使用 MySQL,则应删除该标签。

标签: java spring jpa singlestore


【解决方案1】:

这对我来说是成功的。

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

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

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

【讨论】:

    【解决方案2】:

    您需要使用 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的常见情况,custom Hibernate Type is necessary

    【讨论】:

    【解决方案3】:

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

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

    这会将 JSON 字段类型转换为 text,这是一个字符串数据类型(您也可以根据需要使用 varchar 或任何内容)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2017-08-11
      • 1970-01-01
      • 2016-11-02
      • 2012-10-09
      • 2019-09-19
      相关资源
      最近更新 更多