是否可以使用单个准备好的语句插入填充类型为 set<text> 的列的记录?

Posted

技术标签:

【中文标题】是否可以使用单个准备好的语句插入填充类型为 set<text> 的列的记录?【英文标题】:Is it possible to insert a record that populates a column with type set<text> using a single prepared statement? 【发布时间】:2021-01-20 09:42:40 【问题描述】:

当记录包含一个集合并打算应用于一个“集合”类型的字段时,是否可以使用准备好的语句插入记录?

我可以看到如何使用 QueryBuilder.update -

Update.Where setInsertionQuery = QueryBuilder.update(keyspaceName, tableName)
    .with(QueryBuilder.addAll("set_column", QueryBuilder.bindMarker()))
    .where(QueryBuilder.eq("id_column", QueryBuilder.bindMarker()));
                
PreparedStatement preparedStatement = keyspace.prepare(setInsertionQuery.toString());
Set<String> set = new HashSet<>(Collections.singleton("value"));
BoundStatement boundStatement = preparedStatement.bind(set,"id-value");

但是,QueryBuilder.addAll() 方法返回一个分配,并且这似乎只能与 QueryBuilder.update() 一起使用,而不能与 QueryBuilder.insertInto() 一起使用。有什么方法可以一步插入该记录,还是我必须先调用 QueryBuilder.insertInto() 而将设置列留空,然后再使用使用 addAll() 的后续调用 QueryBuilder.update() 填充它?

【问题讨论】:

【参考方案1】:

我想出了如何做到这一点。关键是调用无参数 PreparedStatement.bind(),然后将其与 setXXX 方法的调用链接起来,使用 setSet() 设置值。所以像这样 -

Insert insertSet = QueryBuilder.insertInto(tableName)
                .value("set_column", QueryBuilder.bindMarker("set_column"))
                .value("id_column", QueryBuilder.bindMarker("id_column")));
    
PreparedStatement preparedStatement = keyspace.prepare(setInsertionQuery.toString());
Set<String> set = new HashSet<>(Collections.singleton("value"));

BoundStatement boundStatement = preparedStatement.bind()
.setSet("id_column",set,String.class))
.setString("id_column", "id value"));

【讨论】:

以上是关于是否可以使用单个准备好的语句插入填充类型为 set<text> 的列的记录?的主要内容,如果未能解决你的问题,请参考以下文章

PDO Prepared在单个查询中插入多行

使用单个查询插入多行时获取所有插入的 ID

SQLITE JDBC 驱动程序准备好的语句失败(内部指针 0)

在使用准备好的语句执行插入查询后获取自动增量 ID

为准备好的语句创建插入查询

单例连接 + 单例准备好的语句