别名为的MySQL select语句失败,未找到列

别名为的MySQL select语句失败,未找到列,mysql,column-alias,Mysql,Column Alias,发展环境参考: Fedora FC18 Tomcat Server 7.0.39 (localhost config) Eclipse Juno Release 2 Mysql-connecor-java Ver. 5.1.26 (jar) Mysql-server Ver. 5.5.32 (jar) 以下select语句因“未找到列“深度”而失败: 此select语句使用命令级mysql作为 use dbName; select node.subEntityID, node.lft, nod

发展环境参考:

Fedora FC18
Tomcat Server 7.0.39 (localhost config)
Eclipse Juno Release 2
Mysql-connecor-java Ver. 5.1.26 (jar)
Mysql-server Ver. 5.5.32 (jar)
以下select语句因“未找到列“深度”而失败:

此select语句使用命令级mysql作为

use dbName;
select node.subEntityID, node.lft, node.rgt, (count(parent.subEntityID) - 1) as depth
  from ENTITY as node, ENTITY as parent
  where node.lft between parent.lft and parent.rgt
  group by node.subEntityID order by node.lft;
在MySQL Workbench版本中使用SQL查询时,select语句也会成功。5.2.4.7

下面给出了相关的Java代码片段:

rs = stmt.executeQuery(typeEntityList);
// The depth alias does not print out in this for loop
for (int i=1; i<rs.getMetaData().getColumnCount()+1; i++) {
    System.out.println(rs.getMetaData().getColumnName(i));
    System.out.println(rs.getMetaData().getColumnLabel(i));
}
while (rs.next()) {
    // "depth" fails at the following statement
    System.out.println("depth: " + rs.getInt("depth"));
    String s = rs.getString("lft") + "  "
        + rs.getString("subEntityID") + "  "
        + rs.getString("rgt");
    System.out.println(s);
    entityList.add(s);
}
rs=stmt.executeQuery(typeEntityList);
//此for循环中不打印深度别名

对于(inti=1;i好吧,我发现了问题所在,但现在我因为长时间拔头发而秃顶了


在EclipseJuno上,有一个选择来“组织”Java源代码的导入。“因此,当我有一个未定义的变量时,我使用这个方便的选项来清除导入。EclipseJuno导入了mysql连接器“Java.sql.connection”,而不是“com.mysql.jdbc.connection”“连接器。我更改了java源代码的导入,现在我很乐意继续使用这个servlet。但在我出去买了一些Propecia或Rogaine或?…Roy W.

之后,我在项目中遇到了类似的问题(我正在使用Eclipse Luna)


我克服它的方法是将MysqlDataSource设置为setUseOldAliasMetadataBehavior(true)

您的错误没有意义。
深度在查询中从未被引用。它被定义为一个列别名。您确定这就是您正在执行的SQL吗?嗨,Chris,谢谢您的快速响应。我试图将上述servlet java代码简化为尽可能简单的代码,以便于说明问题。在doi中ng所以我可能会让它更混乱。无论如何,“typeEntityList”是一个字符串变量,定义为“选择node.subEntityID,node.lft,node.rgt,(count(parent.subEntityID)-1)作为从实体到节点的深度,实体到父实体,其中父实体和父实体之间的node.lft按节点分组。subEntityID按节点排序。lft”。您有没有关于如何在java servlet中检索列别名的示例?非常感谢。RoyDid您尝试
rs.getInt(4)
而不是
rs.getInt(“深度”)
?也尝试
rs.getString(4)
而不是getInt,因为MySql中的count(*)类型是bigint(22)而且它不适合
integer
java类型,对getInt的调用肯定会以转换错误结束。嗨,Kordirkko:谢谢你的建议。不幸的是,在这两种情况下,rs.getInt(4)和rs.getString(4)都以“列索引超出范围,4>3”的错误结束我认为问题在于底层软件,即JDBC驱动程序或与JDBC驱动程序的mysql接口。如前所述,sql语句使用Fedora终端的通用sql命令工作。因此,这让我相信问题不在于sql数据库软件,而在于my的Java连接软件sql数据库服务器。当然,欢迎您提出任何其他建议。
rs = stmt.executeQuery(typeEntityList);
// The depth alias does not print out in this for loop
for (int i=1; i<rs.getMetaData().getColumnCount()+1; i++) {
    System.out.println(rs.getMetaData().getColumnName(i));
    System.out.println(rs.getMetaData().getColumnLabel(i));
}
while (rs.next()) {
    // "depth" fails at the following statement
    System.out.println("depth: " + rs.getInt("depth"));
    String s = rs.getString("lft") + "  "
        + rs.getString("subEntityID") + "  "
        + rs.getString("rgt");
    System.out.println(s);
    entityList.add(s);
}