我有两个问题:
-
当我执行以下代码时:
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>
- 当我尝试此操作时,会出现以下错误:
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);
对于第二个问题,看起来您已经为delivery
和the_farmer
转置了变量。
"PreparedStatement"one_answers"SimpleStatement"之间有什么区别?
SimpleStatement
将在每次执行时解析查询,因此对于重复的语句来说可能会有点开销。另一方面,PreparedStatement
将只解析查询一次,然后将其存储在准备好的语句缓存(集群中(中,以优化未来的使用。
PreparedStatement
还将在客户端提供类型检查,我认为这是这里的核心问题。基本上,如果您可以使用PreparedStatement
让Java代码编译,那么它在执行时就不会遇到类型问题。