java - JDBC 规范是否定义了如果为具有冲突列名的查询调用 `ResultSet.getObject(String)` 会发生什么?
问题描述
我在一些 Java 代码中发现了一个如下所示的 SQL 查询:
SELECT * FROM tableA JOIN tableB ON ...
两者都tableA
包含tableB
名为 的字段id
,执行此查询的 Java 代码执行以下操作:
Integer id = (Integer)rs.getObject("id");
JDBC 规范对返回哪个字段值有什么要说的吗?我还没有找到任何可以说这种或另一种方式的东西。我看到一些数据库抛出错误,但 MySQL/MariaDB(这里使用的数据库)没有抱怨,返回的值似乎是tableA.id
,或者名称为“id”的“最左边”字段。
我在问在这种情况下是否存在规范定义的行为,或者是否由数据库和/或 JDBC 驱动程序来决定如何表现。
不用说,当我查看代码时,我将修复它以使其可预测且明确地工作,但我对答案感到好奇。
解决方案
API 文档ResultSet
回答了您的问题:
用作 getter 方法输入的列名不区分大小写。当使用列名调用 getter 方法并且多个列具有相同名称时,将返回第一个匹配列的值。
第 15.2.3 节检索值中的JDBC 4.3 规范文档还说:
列从左到右编号,因为它们出现在查询的选择列表中,从 1 开始。
提供给 getter 方法的列标签不区分大小写。如果选择列表多次包含同一列,则将返回该列的第一个实例。
可以使用 方法检索列标签的第一个实例的索引
findColumn
。如果未找到指定的列,该方法findColumn
将抛出SQLException
.
因此,如果结果集有多个具有相同(不区分大小写(!))名称的列,则返回第一个匹配列的值。
推荐阅读
- octave - 如何在 GNU Octave 中正交化一组向量?
- recaptcha - 如何查找过去的 reCaptcha 帐户设置?
- html - 在实际元素下方滚动一点
- angular - Angular PATCH 语句中的问题
- c - 为什么`lower,upper = 0,N;`会使lower = 1和upper = 0?
- android - 如何在 Android Studio 的布局编辑器/预览中的 FrameLayout 中显示片段布局?
- c++ - 位运算符 C++
- javascript - 无法正确显示 Angular 对话框
- sql-server - 有没有办法在使用雪花链接服务通过 ADF 将数据从 SQL Server 迁移到雪花时忽略反斜杠?
- ios - 在swift中将字符串转换为日期时返回nil