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

Scala 尝试从h2数据库检索json数据时出错,scala,h2,scalikejdbc,Scala,H2,Scalikejdbc,我有下表定义 create table samples ( channel text, eventType text, data json NOT NULL ); 我还尝试将数据列定义为clob,text,java\u对象,varchar,其他。 我使用以下API在h2中插入数据: def insert(sample: Sample): Unit = DB localTx { implicit session => val propertiesJson = ne

我有下表定义

create table samples (
   channel text,
   eventType text,
   data json NOT NULL
);
我还尝试将
数据
列定义为
clob
text
java\u对象
varchar
其他
。 我使用以下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()
   }
我使用
spray
scalikejdbc
驱动程序进行隐式转换

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

  • 对于
    CLOB
    VARCHAR
    TEXT
    JAVA\u对象
    :我可以在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
时,我也尝试了这个
格式的JSON
指令

另请参见json文字语法。映射到字节[]。设置JSON值的步骤 对于PreparedStatement中的java.lang.String,请使用JSON数据格式 格式(插入测试(ID,数据)值(?,格式JSON))。没有 数据格式VARCHAR值转换为JSON字符串值

但错误仍然是一样的


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

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

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

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