Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC的不明确列,但查询在数据库中运行良好_Java_Sql_Jdbc - Fatal编程技术网

Java 使用JDBC的不明确列,但查询在数据库中运行良好

Java 使用JDBC的不明确列,但查询在数据库中运行良好,java,sql,jdbc,Java,Sql,Jdbc,我使用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.print

我使用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:
则没有此类列:“person.id”

未指定:
不明确的列名“id”


我尝试使用WorkInfo和Person,并使用别名,但它总是抛出相同的模糊列名(如果保留为id),或者列不存在

您要返回的结果集似乎包含以下列:

  • 身份证
  • 名字
  • 身份证
  • 工作
  • 薪水
您有两个名为“id”(没有一个名为“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"));

这可能是因为结果集中的列名不是
Person.id
,您可以尝试按如下索引获取值:
rs.getInt(1)
或使用
rs.getMetaData()
以获取返回的确切列名。@Titus感谢您共享
getMetaData()
,我发现这对调试很有用!我确实怀疑我可能必须指定列名(我太懒了)!感谢您的反馈,您的实现工作得很好。虽然它“不明确”,但JDBC规范规定了如何解决这个问题(应返回第一次出现的列名),因此我不明白为什么驱动程序会在这里抛出错误,除非它不遵守规范,或者实际上是数据库产生了错误。