0

我有下表定义

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

我也尝试将data列定义为clob, text, java_object, varchar, other。我正在使用以下 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

  • 对于CLOB, VARCHAR,TEXTJAVA_OBJECT: 我可以在 h2 中插入数据但是在尝试检索时我得到

    spray.json.JsonParser$ParsingException: Unexpected character 'a' at input index 0 (line 1, position 1), expected JSON Value: aced00057372001c6f72672e706f737467726573716c2e7574696c2e50476f626a656374f903de2682bdcb3b0200024c0004747970657400124c6a6176612f6c616e672f537472696e673b4c000576616c756571007e000178707400046a736f6e74001f7b2270726f7041223a2276616c41222c2270726f7042223a2276616c42227d
    
  • 对于JSON. 我什至无法将数据插入 h2。我越来越

    Caused by: org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "OTHER to JSON" [22018-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:457)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
    ... 114 more
    

使用时JSON我也尝试了这里format json提出的这个指令

另请参阅 json 文字语法。映射到字节[]。要在 PreparedStatement 中使用 java.lang.String 设置 JSON 值,请使用 FORMAT JSON 数据格式 (INSERT INTO TEST(ID, DATA) VALUES (?, ? FORMAT JSON))。没有数据格式的 VARCHAR 值将转换为 JSON 字符串值。

但错误仍然相同。

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

4

1 回答 1

1

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

要从 H2 读取 JSON 值,最好ResultSet.getBytes(…)在 Java/JDBC 和WrappedResultSet.bytes(…)ScalikeJDBC 中使用,它将返回带有 UTF-8 编码的 JSON 文本的字节数组。目前您正在使用一种string(…)方法,它至少应该适用于 H2 1.4.200,但是这种行为没有记录在案,并且可能在未来的版本中进行更改。

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

于 2020-11-28T03:22:08.690 回答