我有一个postgresql表,其中包含一列名为“ tags”的数据类型为varchar []。我想使用JavaScript字符串数组更新“标签”列中的值。我的客户端使用Javascript,服务器端使用Java。
如果将列设置为varchar数据类型而不是varchar [],则没有问题,然后在客户端首先将标记解析为单个逗号分隔的字符串。但是,我们更希望该列包含一个数组。
我首先将一个名为person的对象传递给准备sql查询的Java方法。 Person.values包括我的Javascript字符串数组以及其他列的值。其他值是字符串和整数,没有问题。
这是Java方法,它使用person.values对象并创建一个sql查询...
@POST
@Path("{listid}/{personid}/update")
public Message updatePerson(@PathParam("listid") int listid, @PathParam("personid") int personid,
@NotEmpty Map<String, Object> person) {
StringBuilder buf = new StringBuilder();
buf.append("update table_");
buf.append(listid);
buf.append(" set ");
boolean first = true;
for (String col : person.keySet()) {
if (first) {
first = false;
} else {
buf.append(',');
}
buf.append(col);
buf.append("=?");
}
buf.append(" where personid=?");
ArrayList<Object> args = new ArrayList<>(person.values());
args.add(new Integer(personid));
int count = db.sql(buf.toString(), args.toArray()).execute().getRowsAffected();
if (count <= 0) {
String err = "Failed to update person with personid: " + personid;
logger.error(err);
throw new BadRequestException(err);
}
return Message.success("Person updated");
}
我尝试传递原始的javascript字符串数组。在数组上执行stringify后,我尝试传递JSON数组。
JSON_string = JSON.stringify(javascript_array_of_strings)
我还尝试解析数组以匹配Postgres文档中列出的语法:https://www.postgresql.org/docs/7.4/arrays.html
if (fieldname == "tags") {
fieldvalue = JSON.stringify(fieldvalue);
fieldvalue = fieldvalue.substring(1,fieldvalue.length-1);
fieldvalue = "{"+fieldvalue+"}";
}
this.person[fieldname]=fieldvalue;
这是我继续看到的确切错误...
org.postgresql.util.PSQLException:错误:列“ tags”的字符类型为> varying [],但表达式的字符类型却有所不同提示:您将需要>重写或强制转换该表达式。位置:72
更新: 进一步看了一下。通过直接在postgres中进行测试,我知道此命令语法成功更新了表中的标签值。 通过直接在postgres中进行测试,我知道此命令语法成功更新了表中的标签值。 更新public.table_53设置标签='{“ tag1”,“ tag2”}'其中personid = 1
我正在研究JS必须将标签数组输出到服务的格式,以便服务输出上述黄色突出显示的语法。
我首先尝试使用JSON数组。 [,] Java将其作为ArrayList对象读取。
查询导致此错误...
org.postgresql.util.PSQLException:无法推断用于java.util.ArrayList实例的SQL类型。将setObject()与显式的Types值一起使用以>指定要使用的类型。 我正在阅读setObject()。
我还尝试将标签输出为'{“”,“”}'。 这是行不通的,因为Java将单引号替换为双引号。
org.postgresql.util.PSQLException:错误:列“ tags”的字符类型为> varying [],但表达式的字符类型却有所不同提示:您将需要>重写或强制转换该表达式。位置:63
最后,我再次尝试了相同的操作,但是添加了反斜杠以避开引号。 “ \'{\” tag1 \“,\” tag2 \“} \'” 这也没有用...我认为问题是查询仍然在值周围用双引号引起来。
org.postgresql.util.PSQLException:错误:列“ tags”的字符类型为> varying [],但表达式的字符类型却有所不同提示:您将需要>重写或强制转换该表达式。位置:63