无效的字符串常量或不匹配的输入":"期望"}" - Cassandra DB



我有两个问题:

  1. 当我执行以下代码时:

    public void insertFarmers(int id,HashMap<String,String>the_farmer,List delivery({

    Cluster cluster = Cluster.builder()
    .addContactPoints(serverIP)
    .build();
    try (Session session = cluster.connect("farm_db")) {
    String insert_query = "INSERT INTO farmers (farmer_id, delivery, the_farmer) VALUES ( "
    + "'" +id+ "',"
    + "'" +delivery + "',"
    + "'" +the_farmer + "')";
    session.execute(insert_query);
    }
    

    }

。。。以及我的主类中的这段代码:

HashMap<String, String> the_farmer = new HashMap<>();
the_farmer.put("Name ", " The name ");
the_farmer.put("Farmhouse ", " Varpinge Gard");
the_farmer.put("Foods ", " Fruits & Vegetables");
List<String> delivery = new ArrayList<>();
delivery.add("Malmo Hus parkering");
delivery.add("Lund Golfbana Varpinge");

employeeService.insertFarmers(1, the_farmer, delivery);

我得到这个错误:

InvalidQueryException: Invalid STRING constant ([Malmo Hus parkering, Lund Golfbana Varpinge]) for "delivery" of type list<text>
  1. 当我尝试此操作时,会出现以下错误:
Cluster cluster = Cluster.builder()
.addContactPoints(serverIP)
.build();
try (Session session = cluster.connect("farm_db")) {
SimpleStatement insert_query = new
SimpleStatement("INSERT INTO farmers (farmer_id, delivery, the_farmer) VALUES " +
"(1, {'Name' : 'The name' , 'Farmhouse' : 'Varpinge Gard' : 'Foods' : 'Fruits & Vegetables'}, " +
"['Malmo Hus parkering','Lund Golfbana (Varpinge)']);", id, delivery, the_farmer);
session.execute(insert_query);
}
} 

The error message: 
SyntaxError: line 1:118 mismatched input ':' expecting '}' (...'The name' , 'Farmhouse' : 'Varpinge Gard' [:] 'Food...) 

因此,对集合的类型处理可能很棘手。我能够重现你的错误。

我能够通过使用一个事先准备好的声明来实现这一点:

String insert_query = "INSERT INTO farmers (farmer_id, delivery, the_farmer) VALUES (?,?,?)";
PreparedStatement pStatement = session.prepare(insert_query);
BoundStatement bStatement = pStatement.bind(id, delivery, the_farmer);

session.execute(bStatement);

对于第二个问题,看起来您已经为deliverythe_farmer转置了变量。

"PreparedStatement"one_answers"SimpleStatement"之间有什么区别?

SimpleStatement将在每次执行时解析查询,因此对于重复的语句来说可能会有点开销。另一方面,PreparedStatement将只解析查询一次,然后将其存储在准备好的语句缓存(集群中(中,以优化未来的使用。

PreparedStatement还将在客户端提供类型检查,我认为这是这里的核心问题。基本上,如果您可以使用PreparedStatement让Java代码编译,那么它在执行时就不会遇到类型问题。

最新更新