JOIN中的相同列名在ResultSet

时间:2018-04-23 15:24:18

标签: java mysql jdbc fetch resultset

我有三个表firmshippsupplier

所有三列都有与idnamecity ...其他相同的列名。

我在java中编写了一个连接:

String Query = "SELECT s.name Sname,s.city Scity,f.name Fname,f.city Fcity,"
        +"su.name Suname,su.city Sucity "
        +"FROM `order_details` ot "
        +"INNER JOIN `order` o ON ot.odr_id = o.odr_id " 
        +"INNER JOIN `product` p ON ot.pro_id = p.id "
        +"INNER JOIN `firm` f ON o.firm_id = f.id "
        +"INNER JOIN `shipp` s ON o.shipp_id = s.id "
        +"INNER JOIN `supplier` su ON o.sup_id = su.id ";

productorderorder_details是其他用于加入的表格。

此查询在phpMyAdmin中工作。

在java ResultSet中“未找到列'Sname'。”错误。

我尝试过以下解决方案,但这些对我不起作用:

1)java.sq.SQLException: Column not found

2)Strange SQLException: Column not found

3)许多其他但没有人工作

错误堆栈:

  

java.sql.SQLException:找不到列'Sname'     在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
    在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
    在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)

  

SEVERE:null

请帮助我!

提前致谢。

编辑1:

问题再现:

当我仅使用一个别名表(例如shipp)获取数据来运行它时,它可以很好地获取数据:

SELECT s.name Sname,s.city Scity ... other query part

但是只要我SELECT列来自其他别名表(例如shippfirmsupplier),就会抛出上面写的错误异常(未找到列) )。

SELECT s.name Sname,s.city Scity,f.name Fname,f.city Fcity,
       su.name Suname,su.city Sucity ... other query part

注意:此查询在phpmyadmin中正常运行,但未在ResultSet fetch中运行。

这就是我从ResultSetrs2)获取列的方式:

String firstColumn = "";
String secondColumn = "";

while(rs2.next()) {
    firstColumn = "Shipp to : ";
    firstColumn += rs2.getString("Sname") + rs2.getString("Scity") ;
    firstColumn += "Person : " + rs2.getString("Fname") +"+ "+ rs2.getString("Fcity");

    secondColumn = "Supplier : " + rs2.getString("Suname");
    secondColumn += rs2.getString("Suname");
    secondColumn += rs2.getString("Sucity");
}

2 个答案:

答案 0 :(得分:3)

根据您的错误消息,我假设您正在使用MySQL和最新的连接器。

如果需要,您可以使用positional queries,这是使用可以找到该元素的位置的数字,例如:

rs2.getString(1);

(是的,编号从1开始......)它应该等同于此(当然没有大写问题):

rs2.getString("Sname");

这样你只需要知道位置,但是如果你看一下数据库/驱动程序中的区分大小写几乎是设置的问题。为了解决大多数问题,如果可能的话,我会用资本编写我的查询,而不需要反引号。

要探索您的ResultSet对象,请尝试以下操作:

Statement statement = ...;
String queryString = "SELECT s.name sname,s.city scity,f.name fname, f.city fcity, su.name suname, su.city sucity "
        +" FROM `order_details` ot "
        +" INNER JOIN `order` o ON ot.odr_id = o.odr_id "
        +" INNER JOIN `product` p ON ot.pro_id = p.id "
        +" INNER JOIN `firm` f ON o.firm_id = f.id "
        +" INNER JOIN `shipp` s ON o.shipp_id = s.id "
        +" INNER JOIN `supplier` su ON o.sup_id = su.id ";
ResultSet resultSet = statement.executeQuery(queryString);
ResultSetMetaData metaData = resultSet.getMetaData();
int colCount = metaData.getColumnCount();
if (resultSet.next()) {
    for (int i = 1; i <= colCount; i++) {
        System.out.println("Col(" + i + ") '" + metaData.getColumnName(i) + "' value:" + resultSet.getString(i));
    }
}else{
   System.out.println("No row found.");
}

此代码段将首先打印您正在使用的驱动程序返回的列和值。

答案 1 :(得分:1)

请检查您是否导入了正确的jdbc连接包com.mysql.jdbc.connection。您可以将java.sql.connection改为here