尝试从 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
列定义为 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
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 数据类型。
我有以下table定义
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
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 数据类型。