问题描述
当记录包含Set并打算应用于类型为“ set”的字段时,是否可以使用准备好的语句插入记录?
我可以看到如何使用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()方法返回一个Assignment,它似乎仅可用于QueryBuilder.update(),而不能用于QueryBuilder.insertInto()。有什么办法可以一步插入该记录,还是我必须先调用QueryBuilder.insertInto()而将set列保留为空白,然后再使用随后的调用来填充它,而QueryBuilder.update()也使用addAll() ?
解决方法
我想出了办法。关键是调用no-arg PreparedStatement.bind(),然后使用setSet()作为设置值将其链接到对setXXX方法的调用。像这样-
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"));