使用 JDBC 的不明确列,但查询在数据库中工作正常
Ambiguous column using JDBC but query works fine in database
我正在使用 JDBC 通过 java 连接到 SQLite 数据库。
架构:
WorkInfo(id, job, salary)
Person(id, name)
下面的这个查询在我的数据库中运行良好,但是当我尝试使用 JDBC:
ResultSet rs = statement.executeQuery("select * from Person join workInfo on (Person.id=WorkInfo.id)");
while(rs.next()){
System.out.println("id: " + rs.getInt("Person.id")); //column does not exist
System.out.println("name: " + rs.getString("name")); //works fine
输出:
如果使用 person.id:no such column: 'person.id'
不指定:ambiguous column name 'id'
我试过同时使用 WorkInfo 和 Person 并使用别名,但它总是抛出相同的模糊列名(如果保留为 id)或列不存在。
您返回的结果集似乎包含以下列:
- 编号
- 名字
- 编号
- 工作
- 工资
您有两列名为 "id"(none 名为 "Person.id"),因此当您尝试获取其值时,您要么
- 询问"id"哪个不明确(哪个id?)
- 要求"Person.id"不存在
只需尝试在查询中指定所需的列并为它们指定唯一的别名。例如:
ResultSet rs = statement.executeQuery("select Person.id AS 'personid', name from Person join workInfo on (Person.id=WorkInfo.id)");
while(rs.next()){
System.out.println("id: " + rs.getInt("personid"));
System.out.println("name: " + rs.getString("name"));
显式检索所需的列始终是一个好习惯。我会将查询更改为:
ResultSet rs = statement.executeQuery("select info.id, info.job, info.salary, "
+ "person.id, person.name from Person person join workInfo info "
+ "on person.id=info.id");
while(rs.next()){
System.out.println("id: " + rs.getInt(4));
System.out.println("name: " + rs.getString(5));
在这种情况下,您可以使用列索引代替标签。
或使用 AS
子句:
ResultSet rs = statement.executeQuery("select info.id, info.job, info.salary, "
+ "person.id as personId, person.name as personName "
+ "from Person person join workInfo info "
+ "on person.id=info.id");
while(rs.next()){
System.out.println("id: " + rs.getInt("personId"));
System.out.println("name: " + rs.getString("personName"));
经过一天的努力,我使用 resultSet.getMetaData() 实现了它。
private int getIndexFromMeta(String column) {
try {
ResultSetMetaData meta = resultSet.getMetaData();
String[] subs = column.split("\.", -1);
String tableName = subs[0];
String columnName = subs[1];
for (int i = 1; i <= meta.getColumnCount(); i++) {
if (meta.getTableName(i).equals(tableName) && meta.getColumnName(i).equals(columnName)) {
return i;
}
}
} catch (SQLException e) {
Log.trace(e);
}
return 0;
}
我正在使用 JDBC 通过 java 连接到 SQLite 数据库。
架构:
WorkInfo(id, job, salary)
Person(id, name)
下面的这个查询在我的数据库中运行良好,但是当我尝试使用 JDBC:
ResultSet rs = statement.executeQuery("select * from Person join workInfo on (Person.id=WorkInfo.id)");
while(rs.next()){
System.out.println("id: " + rs.getInt("Person.id")); //column does not exist
System.out.println("name: " + rs.getString("name")); //works fine
输出:
如果使用 person.id:no such column: 'person.id'
不指定:ambiguous column name 'id'
我试过同时使用 WorkInfo 和 Person 并使用别名,但它总是抛出相同的模糊列名(如果保留为 id)或列不存在。
您返回的结果集似乎包含以下列:
- 编号
- 名字
- 编号
- 工作
- 工资
您有两列名为 "id"(none 名为 "Person.id"),因此当您尝试获取其值时,您要么
- 询问"id"哪个不明确(哪个id?)
- 要求"Person.id"不存在
只需尝试在查询中指定所需的列并为它们指定唯一的别名。例如:
ResultSet rs = statement.executeQuery("select Person.id AS 'personid', name from Person join workInfo on (Person.id=WorkInfo.id)");
while(rs.next()){
System.out.println("id: " + rs.getInt("personid"));
System.out.println("name: " + rs.getString("name"));
显式检索所需的列始终是一个好习惯。我会将查询更改为:
ResultSet rs = statement.executeQuery("select info.id, info.job, info.salary, "
+ "person.id, person.name from Person person join workInfo info "
+ "on person.id=info.id");
while(rs.next()){
System.out.println("id: " + rs.getInt(4));
System.out.println("name: " + rs.getString(5));
在这种情况下,您可以使用列索引代替标签。
或使用 AS
子句:
ResultSet rs = statement.executeQuery("select info.id, info.job, info.salary, "
+ "person.id as personId, person.name as personName "
+ "from Person person join workInfo info "
+ "on person.id=info.id");
while(rs.next()){
System.out.println("id: " + rs.getInt("personId"));
System.out.println("name: " + rs.getString("personName"));
经过一天的努力,我使用 resultSet.getMetaData() 实现了它。
private int getIndexFromMeta(String column) {
try {
ResultSetMetaData meta = resultSet.getMetaData();
String[] subs = column.split("\.", -1);
String tableName = subs[0];
String columnName = subs[1];
for (int i = 1; i <= meta.getColumnCount(); i++) {
if (meta.getTableName(i).equals(tableName) && meta.getColumnName(i).equals(columnName)) {
return i;
}
}
} catch (SQLException e) {
Log.trace(e);
}
return 0;
}