You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中PreparedStatement执行SQL无结果返回问题求助

问题原因及解决方案

你的问题核心是手动给PreparedStatement的参数添加了单引号,这完全没必要,反而导致查询条件不匹配。

错误分析

PreparedStatement的占位符?会自动处理字符串参数的引号包裹与转义逻辑。你手动把参数拼成'679223'后,最终执行的SQL会变成:

SELECT sales_order_id FROM mtl_sales_orders WHERE segment1 = '''679223'''

相当于在查找segment1等于带单引号的字符串'679223',但数据库里的segment1实际值是不带外层单引号的679223,自然查不到结果。

修正后的代码

String query = "SELECT sales_order_id FROM mtl_sales_orders WHERE segment1 = ?";
// 直接使用原始值,不要手动添加单引号
String segmentValue = l_order_number;
System.out.println("segmentValue: " + segmentValue); // 输出应为679223

PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, segmentValue);
// 如果segment1是NUMBER类型,建议用数字类型方法更匹配:
// stmt.setLong(1, Long.parseLong(l_order_number));
ResultSet rs = stmt.executeQuery();

if (rs.next()) {
    // 无需提前判断isBeforeFirst,直接用rs.next()即可检测结果
    long salesOrderId = rs.getLong("sales_order_id");
    System.out.println("sales_order_id: " + salesOrderId);
} else {
   System.out.println("No rows found in the result set.");
}

额外提示

  • 如果segment1字段是数字类型(比如Oracle的NUMBER),优先使用setLong/setInt这类对应数字类型的方法,避免字符串转数字的潜在问题。
  • rs.isBeforeFirst()可以省略,直接通过rs.next()判断是否有结果,代码更简洁。

内容的提问来源于stack exchange,提问作者Programming_guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:12:46