首页 > 解决方案 > 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 驱动程序来决定如何表现。

不用说,当我查看代码时,我将修复它以使其可预测且明确地工作,但我对答案感到好奇。

标签: javamysqljdbc

解决方案


API 文档ResultSet回答了您的问题:

用作 getter 方法输入的列名不区分大小写。当使用列名调用 getter 方法并且多个列具有相同名称时,将返回第一个匹配列的值。

第 15.2.3 节检索值中的JDBC 4.3 规范文档还说:

列从左到右编号,因为它们出现在查询的选择列表中,从 1 开始。

提供给 getter 方法的列标签不区分大小写。如果选择列表多次包含同一列,则将返回该列的第一个实例。

可以使用 方法检索列标签的第一个实例的索引findColumn。如果未找到指定的列,该方法findColumn将抛出SQLException.

因此,如果结果集有多个具有相同(不区分大小写(!))名称的列,则返回第一个匹配列的值。


推荐阅读