如何在`PreparedStatement`中将表达式作为参数提供

3
这张表格代表了一个单选按钮
id    | radio_id    | value    | is_selected
------|-------------|----------|-------------
1     | 10          | one      | false
2     | 10          | two      | false
3     | 10          | three    | true

我可以运行以下查询来选择另一个收音机。
UPDATE TABLE radios SET is_selected = (id = 1) WHERE radio_id = 10

使用这个查询,我也确保只选择了一个单选框。

id    | radio_id    | value    | is_selected
------|-------------|----------|-------------
1     | 10          | one      | true
2     | 10          | two      | false
3     | 10          | three    | false

但是我无法使用PreparedStatement做同样的事情。

PreparedStatement ps = con.prepareStatement("UPDATE TABLE radios SET is_selected = ? WHERE radio_id = ?");
ps.setObject(1, "(id = 1)");
ps.setInt(2, 10);

但是我遇到了“String无法转换为boolean”的错误。如何在预编译语句中提供表达式作为参数。


更新表格?(我第一次看到这个) - user180100
不理解这部分代码 is_selected = (id = 1),我会认为你想在这里设置一个布尔值...基本上这就是你的错误信息告诉你的...你试图设置一个字符串 (id=1), 但实际上需要的是一个布尔值。 - hatze
你为什么要将GUI模型存储在数据库中?你只打算支持一个用户吗? - user207421
你可能误解了预处理语句的要点。在 SQL 中,你只能用参数替换被视为字面量的内容。你不能替换关键词、符号或表达式。在你原始的查询中,只有 110 是字面量。(id = 1) 是一个返回布尔结果的表达式。 - billc.cn
@EJP 这是一个项目的一部分,用户可以创建自己的字段。而单选按钮就是其中之一。 - afzalex
2个回答

3
PreparedStatement ps = 
    con.prepareStatement("UPDATE TABLE radios SET is_selected = (id = ?) WHERE radio_id = ?");
ps.setInt(1, 1);
ps.setInt(2, 10);

实际上,查询是在其他类中动态创建的。我只需要传递键值对和表名与 where,即字段名-字段值对和带有 where 的表名。所以我不能这样做。 - afzalex
你可以更改创建查询的方法吗? - Dmytro Plekhotkin
你可能考虑更改方法的设计,仅将值作为参数传递。 - Dmytro Plekhotkin

1

Why not just do:

con.prepareStatement("UPDATE radios SET is_selected = (id = 1) WHERE radio_id = ?");

实际上,查询是在其他类中动态创建的。我只需要传递键值对和带有“where”的表名,即字段名称-字段值对和带有“where”的表名。所以我不能这样做。 - afzalex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接