尝试从 h2 数据库检索 json 数据时出错

Error when trying to retrieve json data from h2 database

我有以下table定义

create table samples (
   channel text,
   eventType text,
   data json NOT NULL
);

我还尝试将 data 列定义为 clobtextjava_objectvarcharother。 我正在使用以下 API 在 h2 中插入数据:

def insert(sample: Sample): Unit = DB localTx { implicit session =>
    val propertiesJson = new PGobject()
    propertiesJson.setType("json")
    propertiesJson.setValue(sample.properties.toJson.toString)
    sql"""
         insert into samples
         (channel,eventType,data) values (${sample.channel}, ${sample.eventType},$propertiesJson )
    """.update().apply()

}

和这个检索数据

  def find(channel: String): List[Sample] = DB readOnly { implicit session =>
    sql"""
     select * from samples where channel = $channel
     """.map(rs => {

     Sample(
       channel = rs.string("channel"),
       properties = rs.string("data").parseJson.convertTo[Map[String, String]],
       eventType = rs.string("eventType")
     )
    }
    ).list().apply()
   }

我正在使用 sprayscalikejdbc 驱动程序进行隐式转换。

根据 data 列的数据类型,我会收到不同的错误。

在使用JSON时我也试过这个format json指令建议here

See also json literal grammar. Mapped to byte[]. To set a JSON value with java.lang.String in a PreparedStatement use a FORMAT JSON data format (INSERT INTO TEST(ID, DATA) VALUES (?, ? FORMAT JSON)). Without the data format VARCHAR values are converted to a JSON string values.

但错误还是一样。

有什么想法吗?如何成功地从 h2 数据库插入和检索 JSON 数据?我的做法有什么问题吗?

我不熟悉Scala,但是你肯定不能用PGobject和H2,这个class是PgJDBC特有的。要将 JSON 值传递给 H2,您需要使用普通字节数组(Java 中的 byte[],Scala 中的 Array[Byte]);传递的数组应包含 UTF-8、UTF-16 或 UTF-32 编码的 JSON 文本。如果愿意,您也可以使用 java.lang.String,但它需要在参数后的 SQL 中使用 FORMAT JSON 子句。

要从 H2 中读取 JSON 值,最好在 Java/JDBC 中使用 ResultSet.getBytes(…),在 ScalikeJDBC 中使用 WrappedResultSet.bytes(…),它将 return 字节包含 JSON 文本的 UTF-8 编码数组。目前您正在使用 string(…) 方法,它至少应该适用于 H2 1.4.200,但此类行为未记录在案,可能会在未来的版本中更改。

这些建议适用于 H2 的内置 JSON 数据类型。