JDBC规范是否定义了如果您为具有冲突的列名的查询调用`ResultSet.getObject(String)`会发生什么?

问题描述 投票:2回答:1

我在一些类似以下的Java代码中找到了一个SQL查询:

SELECT * FROM tableA JOIN tableB ON ...

tableAtableB都包含名为id的字段,执行此查询的Java代码执行此操作:

Integer id = (Integer)rs.getObject("id");

JDBC规范对要返回哪个字段值有什么说法吗?我一直找不到能说一种或另一种方式的东西。我看到有些数据库throw an error,但MySQL / MariaDB(正在使用的数据库,这里)没有抱怨,返回的值似乎是tableA.id或名称为“ id”的“最左侧”字段。

我问这种情况下是否存在规范定义的行为,还是由数据库和/或JDBC驱动程序决定如何行为。

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

java mysql jdbc
1个回答
2
投票

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

用作获取方法的输入的列名不区分大小写。用一个列名和几个列调用getter方法时具有相同的名称,则第一个匹配列的值将是返回。

[第15.2.3节检索值als中的ResultSet文档说:

这些列从左到右编号,就像它们在选择查询列表,从1开始。

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

可以检索列标签的第一个实例的索引使用方法JDBC 4.3 specification。如果找不到指定的列,方法findColumn抛出findColumn

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

© www.soinside.com 2019 - 2024. All rights reserved.