我正在使用 Hiberante 连接到 postgres 数据库。我试图将记录插入数据库。我有一个字符串数组中的记录值,我从csv文件中获取。这是我的代码
StringBuffer query=new StringBuffer("insert into t_wonlist values(");
for(int i=0;i<67;i++){
query.append(values[i]+",");
}
query.deleteCharAt(query.lastIndexOf(","));
query.append(");");
sessionfactory.getCurrentSession().createSQLQuery(query.toString()).executeUpdate();
System.out.println("Query executed");
sessionfactory.getCurrentSession().flush();
我正在使用StringBuffer,因此我可以使用for循环将值附加到查询中。
但是当我执行查询时,我收到以下异常
org.postgresql.util.PSQLException: No value specified for parameter 1.
我确信参数的数量是正确的。有人能帮我吗。感谢
答案 0 :(得分:4)
你以一种奇怪而倒退的方式接近这一点。
直接问题可能是无法在其中一个输入字符串中转义/引用?
,因此PgJDBC认为它是一个查询参数。这并不意味着你应该通过转义/引用问号来修复它,这是一个表明你采取完全错误方法的标志。
请阅读this page on SQL injection和this site。
您正在使用Hibernate ORM,因此您通常使用JPA接口或直接Hibernate接口来创建新的域对象并持久化它们。典型的方法是new
一个对象,然后使用EntityManager.persist
方法(如果使用JPA)或Session.save
方法(如果直接使用Hibernate)来持久保存实体。
如果要使用直接JDBC,则应创建JDBC PreparedStatement
,设置其参数,然后应用它。见this tutorial。由于您正在加载CSV,因此通常在JDBC批处理中执行此操作,但这实际上并没有在PostgreSQL中获得太多。
更好的是,由于您要导入CSV,您可以通过PgJDBC的CopyManager使用PostgreSQL的内置COPY
命令将更改有效地流式传输到目标表中。