尝试从 h2 数据库中检索 json 数据时出错
Posted
技术标签:
【中文标题】尝试从 h2 数据库中检索 json 数据时出错【英文标题】: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
);
我也尝试将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()
我正在使用 spray
和 scalikejdbc
驱动程序进行隐式转换。
根据data
列的数据类型,我会遇到不同的错误。
对于 CLOB
,VARCHAR
,TEXT
和 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
指令建议here
另见 json 文字语法。映射到字节[]。设置 JSON 值 在 PreparedStatement 中使用 java.lang.String 使用 FORMAT JSON 数据 格式(插入测试(ID,数据)值(?,?格式 JSON))。没有 将数据格式 VARCHAR 值转换为 JSON 字符串值。
但错误还是一样。
所以有什么想法吗?如何从 h2 数据库中成功插入和检索 JSON 数据?我的方法有什么问题吗?
【问题讨论】:
【参考方案1】:我不熟悉 Scala,但你绝对不能在 H2 中使用 PGobject
,这个类是 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(…)
,它将返回带有 UTF-8 编码的 JSON 文本的字节数组。目前您正在使用string(…)
方法,它至少应该适用于 H2 1.4.200,但这种行为没有记录在案,可能会在未来的版本中更改。
这些建议适用于 H2 的内置 JSON 数据类型。
【讨论】:
以上是关于尝试从 h2 数据库中检索 json 数据时出错的主要内容,如果未能解决你的问题,请参考以下文章