Warm tip: This article is reproduced from serverfault.com, please click

scala-尝试从H2数据库检索JSON数据时出错

(scala - Error when trying to retrieve json data from h2 database)

发布于 2020-11-27 17:13:39

我有以下表格定义

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

我也想定义dataclobtextjava_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的数据类型,我会得到不同的错误

  • 对于CLOBVARCHARTEXT而且JAVA_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文字语法。映射到byte []。要在PreparedStatement中使用java.lang.String设置JSON值,请使用FORMAT JSON数据格式(INSERT INTO TEST(ID,DATA)VALUES(?,?FORMAT JSON))。没有数据格式,VARCHAR值将转换为JSON字符串值。

但错误仍然相同。

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

Questioner
Niko
Viewed
12
Evgenij Ryazanov 2020-11-28 11:22:08

我对Scala不熟悉,但是你绝对不能PGobject与H2一起使用,该类特定于PgJDBC。要将JSON值传递给H2,你需要使用纯字节数组(byte[]在JavaArray[Byte]中为Scala);传递的数组应包含UTF-8,UTF-16或UTF-32编码的JSON文本。你也可以根据需要使用a java.lang.String,但是它将FORMAT JSON在SQL中的参数后面需要有子句。

要从H2读取JSON值,最好ResultSet.getBytes(…)在Java / JDBC和WrappedResultSet.bytes(…)ScalikeJDBC中使用,它会以UTF-8编码返回带有JSON文本的字节数组。当前,你正在使用一种string(…)方法,该方法至少也应与H2 1.4.200一起使用,但是这种行为尚未记录,在以后的发行版中可能会更改。

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