我正在使用vertx的JDBC库,我需要批量插入包含数组字段的值。
我试过这个:
String query = "UPSERT INTO " + TABLENAME + " (ID, NODES) VALUES (?,?)";
JsonArray param= new JsonArray();
param.add(currentUser.getId().toString());
param.add(new JsonArray(currentUser.getNodes()));
List<JsonArray> params = new ArrayList<>();
params.add(param);
我的输出:
UPSERT INTO USER (ID, NODES) VALUES (?,?)
[["4ec99c96-7ece-34df-9da0-c42e18f9ec51",["9385fe01-980b-3fb1-b911-7cc3a62c028b","1a05f21a-5278-3d2c-8ee1-b8fd44059e5b","a0b34f81-ef77-3eb2-9c81-8841b9277dd8","2e2ebd32-a7a9-38c8-9b35-b7d1c9b97335","7384ac4c-9796-38b1-8069-45bfc57f1beb","19afe185-8b2a-324e-a8e1-0861a0df8d40","e5efd51e-cc8f-348c-a975-5a25ac9f3321","b9bd2bf0-a581-31a5-a4ca-531cfd0420a1","97200212-af2a-3db9-bfe9-c7a9e09da278","919b6f2a-25f9-32d4-bae3-1a270a1e7e6d","a5271df9-aee2-36ae-85ff-b706cac8be2d","b9ad27fd-28b6-3463-b3e9-1e98e0e3c0e1","37c3790a-cd1d-3d1a-91e4-95fbcd25c592","d3b74229-5b18-3e3e-863e-1b56c2e024ba","331f9940-39ce-3af2-b9ba-cfb6d08066bf","14ee65c5-d48c-3c85-ae9e-639c918af5bd","f81898a1-aad9-34bf-ab3f-e7c314c74a81","48adeeeb-8301-39d3-bfd9-9e5557504b55","68f1d824-1c62-3d6d-a529-ef15cda96ad1"]]]
在切换到准备好的陈述之前,我的工作要求是:
String query = "UPSERT INTO " + TABLENAME + " (ID, NODES) VALUES ('id',ARRAY['1','2'])";
phoenixSharedJDBCClient.getConnection(conn -> {
if (conn.succeeded()) {
SQLConnection connection = conn.result();
connection.batchWithParams(query,params, res -> {
if (res.succeeded()) {
resultHandler.handle(Future.succeededFuture(Boolean.TRUE));
} else if (res.failed()) {
resultHandler.handle(Future.failedFuture("Prepared statement request: "+res.cause().getMessage()));
}
});
connection.close();
}
我的数据库是Apache Phoenix,是Hbase的一个sql层。
知道如何解决这个问题吗?
答案 0 :(得分:2)
目前vert.x JDBC客户端无法处理数组,因为底层JDBC API要求在开始时知道数组中的数据类型,我们无法从JSON中检测到它。
试图解决这个问题:https://github.com/vert-x3/vertx-jdbc-client/commit/3ea6103f4d698137da533522f2c3d4096522f8c6但它是非常特定的RDBMS,它适用于Postgres,因为在处理空数组时总是接受oid
引用,但是没有这样的东西(据我所知)其他RDBMS。
很遗憾你现在还需要依赖你的字符串连接,直到我们能够改进当前的API,或者本着开源的精神,帮助我们讨论用例并集体讨论我们如何解决它。