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
相关产品推荐
相关产品推荐

