mysql - JDBC SQL 别名不起作用

标签 mysql jakarta-ee jdbc thymeleaf

我正在尝试在我的 Java Web 应用程序中运行以下查询:

SELECT platform AS "Platform" FROM edb.cases

Web 应用程序运行良好并且能够执行所有查询,但是每当我使用别名(通过“AS”)时,生成的数据集都会为别名提供空值。事实上,尽管在上述查询中为列“平台”使用了别名,结果数据集的键“平台”为空值,但为键“平台”提供了正确的值(这是原始的列的名称)。

现在我需要执行的实际 sql 语句使用 select 语句有点复杂,并且使用别名在同一个表上左连接两次,如下所示:

 SELECT numOne.platform , numTwo.platform AS 'PlatformTwo' FROM edb.cases LEFT JOIN 
 edb.platform as numOne ON (numOne.rank = cases.platform) LEFT JOIN edb.platform as numTwo ON 
 (numTwo.rank = cases.highestPlatform) WHERE cases.index = 1000

问题是结果数据集包含键“platform”(对于 numOne 表)的正确值,但键“PlatformOne”和“PlatformTwo”不存在。别名不起作用!

我已经在 MySql workbench 中尝试了这两个语句,它们工作正常。

请随时询问更多信息。

编辑:

准备查询并将其发送到数据库的代码:

public static List<Map<String, Object>> executeQuery(final String query,
        Map<Integer, Object> data) {
    List<Map<String, Object>> result = null;
    try {
        Connection conn = createConnection();
        PreparedStatement pstmt = null;

        pstmt = conn.prepareStatement(query);
        if(data != null) {
            pstmt = createPreparedStatement(pstmt, data);
        }

        System.out.println(pstmt.toString());
        //The GET_CASE_FOR_INDEX query uses the executequery function in the else block:
        if((pstmt.toString().indexOf("INSERT") >= 0) || (pstmt.toString().indexOf("UPDATE") >= 0)) { 
            pstmt.executeUpdate();
        } else {
            ResultSet rs = pstmt.executeQuery();

            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();
            result = new ArrayList<Map<String, Object>>();
            /*
             * Get the next row of the ResultSet 'rs' and insert a Map of the Column/Value pair
             * into the ArrayList of Maps 'result'
             */
            while(rs.next()) {
                Map<String, Object> row = new HashMap<String, Object>(columns);
                for(int i=1; i <= columns; i++) {
                    try {
                        row.put(md.getColumnName(i), rs.getObject(i));
                    } catch(Exception e) {
                        System.out.println(md.getColumnName(i));
                        System.out.println(row);
                        e.printStackTrace();
                    }
                }
                result.add(row);
            }
        }

        destroyConnection(conn);
        pstmt.close();
    } catch(SQLException e) {
        //TODO
        e.printStackTrace();
    }
    return result;
}

创建准备语句的函数:

//creates a prepared statement by checking the type of the value that needs to be set.
private static PreparedStatement createPreparedStatement(
        PreparedStatement pstmt, Map<Integer, Object> data) {
    try {
        for(Integer key : data.keySet()) {
            Object value = data.get(key);

            System.out.println(key);
            if(data.get(key).equals(Types.NULL)) {
                pstmt.setNull(key, Types.INTEGER);
            } else if(value.getClass().equals(Integer.class)) {
                pstmt.setInt(key, (Integer) value);
            } else if(value.getClass().equals(String.class)) {
                pstmt.setString(key, (String) value);
            } else if(value.getClass().equals(Date.class)) {
                pstmt.setDate(key, (Date) value); 
            } else if(value.getClass().equals(Timestamp.class)) {
                pstmt.setTimestamp(key, (Timestamp) value);
            }
        }
    }catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return pstmt;
}

以及使用 executeQuery 函数执行查询并将其发送到 Web 模板的代码片段:

Map<Integer, Object> data_details = new HashMap<Integer, Object>();
data_details.put(1, parameter_ID);

List<Map<String, Object>> details = DBUtility.executeQuery(DBQuery.GET_CASE_FOR_INDEX, data_details);

webContext.setVariable("details", details);//This is where the template variable is being set

System.out.println(details);

GET_CASE_FOR_INDEX 查询是:

SELECT numOne.platform , numTwo.platform AS 'PlatformTwo' FROM edb.cases LEFT JOIN 
edb.platform as numOne ON (numOne.rank = cases.platform) LEFT JOIN edb.platform as numTwo ON 
(numTwo.rank = cases.highestPlatform) WHERE cases.index = ?

当我打印详细信息 HashMap (这是结果数据集)时,关键 PlatformTwo 完全不存在!

最佳答案

您正在使用 ResultSetMetaData.getColumnName 方法,它返回基础列的名称(如果可用)。 .getColumnLabel 将返回由 SELECT ... AS ... 定义的列别名。

为了说明,下面的Java代码

PreparedStatement ps = conn.prepareStatement(
    "SELECT platform AS Platypus FROM cases");
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println(String.format(
    ".getColumnName returns \"%s\"", 
    rsmd.getColumnName(1)));
System.out.println(String.format(
    ".getColumnLabel returns \"%s\"", 
    rsmd.getColumnLabel(1)));

返回

.getColumnName returns "platform"
.getColumnLabel returns "Platypus"

关于mysql - JDBC SQL 别名不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27205855/

相关文章:

mysql - 在新服务器上导致 'Type mismatch' 错误的经典 ASP 脚本

python - 如何从运行在 Google App Engine SDK 上的 Python 应用程序访问本地 MySQL 实例?

jakarta-ee - EJB 调用另一个 EJB 方法

java - 如何在单个 java 服务器上加载多个 sqlite 驱动程序版本?

java - 从 java7 tomcat7 迁移到 java8 tomcat8 时启动 tomcat 时出错

java - 使用有效查询字符串的PreparedStatement MySQLSyntaxErrorException

php - MYSQL 查询可以从日期时间字段中选择插入日期等于更新日期的记录

php - 无法显示来自mysql php的两个图像链接

php - 数据库连接池真的那么重要吗?

java - 如何使用基于用户信息提供服务的util类