我在一些类似以下的Java代码中找到了一个SQL查询:
SELECT * FROM tableA JOIN tableB ON ...
tableA
和tableB
都包含名为id
的字段,执行此查询的Java代码执行此操作:
Integer id = (Integer)rs.getObject("id");
JDBC规范对要返回哪个字段值有什么说法吗?我一直找不到能说一种或另一种方式的东西。我看到有些数据库throw an error,但MySQL / MariaDB(正在使用的数据库,这里)没有抱怨,返回的值似乎是tableA.id
或名称为“ id”的“最左侧”字段。
我问这种情况下是否存在规范定义的行为,还是由数据库和/或JDBC驱动程序决定如何行为。
不用说,我将在查看代码时将其修复为可预测且明确地工作,但是我对答案感到好奇。
ResultSet
的API文档回答了您的问题:
用作获取方法的输入的列名不区分大小写。用一个列名和几个列调用getter方法时具有相同的名称,则第一个匹配列的值将是返回。
[第15.2.3节检索值als中的ResultSet
文档说:
这些列从左到右编号,就像它们在选择查询列表,从1开始。
提供给getter方法的列标签不区分大小写。如果一个选择列表多次包含同一列,第一个列的实例将被返回。
可以检索列标签的第一个实例的索引使用方法JDBC 4.3 specification。如果找不到指定的列,方法
findColumn
抛出findColumn
。
因此,如果结果集有多个具有相同名称(不区分大小写(!))的列,则将返回第一个匹配列的值。