【问题标题】:Bad SQL grammar -The column name was not found in this ResultSet?错误的 SQL 语法 - 在此 ResultSet 中找不到列名?
【发布时间】:2019-12-12 22:19:07
【问题描述】:

您好,我正在使用 JDBC 查询,我遇到了这个错误,但我不明白为什么,或者这个错误的确切含义是什么以及查询有什么问题。 查询如下

private List<StatisticsLog>  runStatistics(Integer partnerId, LocalDate ldStart, LocalDateTime ldtEnd, String statType)
    {
        return jdbcTemplate.query("SELECT S.APP_ID, S.LOG_TYPE, ACC.CONTACT_PERSON_FIRST_NAME, ACC.CONTACT_PERSON_LAST_NAME, ACV.VERSION_APP_NAME, "
                + "'" + statType.trim() + "' STATTYPE, "
                + "ACV.APP_CATALOG_ID, ACV.APP_CATALOG_VERSION_ID, ACV.VERSION, ACV.UPDATED_AT, ACV.VERSION_LOGO_EXT, ACV.HAS_LOGO, "
                + "LANG.LANGUAGE_NAME_SHORT, LANG.LANGUAGE_ID , S.count, S.PARTNER_ID, APP.CREATED_AT "
                + "FROM (SELECT partner_id, log_type, app_id, language_id, count(*) as count FROM public.statistics_log "
                + " WHERE partner_id = ? "
                + " and logged_at between ? and ? "
                + "group by 1, log_type, app_id, language_id) as S "
                + "INNER JOIN APP_CATALOG_ACCOUNT ACP ON ACP.APP_CATALOG_SERIAL_ID = S.APP_ID "
                + "INNER JOIN APP_CATALOG APP ON APP.APP_CATALOG_SERIAL_ID = S.APP_ID "
                + "INNER JOIN ACCOUNT ACC ON ACC.ACCOUNT_ID = S.PARTNER_ID "
                + "INNER JOIN APP_CATALOG_VERSION ACV on ACV.APP_CATALOG_SERIAL_ID = APP.APP_CATALOG_SERIAL_ID AND ACV.STATUS = 3 "
                + "INNER JOIN LANGUAGE LANG ON LANG.LANGUAGE_ID = ACV.LANGUAGE_ID "
                + "ORDER BY S.count desc ",
                new Object[] { partnerId, ldStart, ldtEnd }, new StatisticsLogRowMapper());
    }

我从该列CREATED_AT 中收到错误,这是应用程序目录的一部分,我认为它应该在那里,还有更详细的我会附上StatisticsLogRowMapper

public class StatisticsLogRowMapper implements RowMapper<StatisticsLog>
{
    @Override
    public StatisticsLog mapRow(ResultSet rs, int rowNum) throws SQLException
    {
        StatisticsLog stat = new StatisticsLog();

        stat.setAppId(rs.getInt("APP_ID"));
        stat.setPartnerId(rs.getInt("PARTNER_ID"));
        stat.setCount(rs.getLong("COUNT"));
        stat.setCreatedAt(rs.getTimestamp("CREATED_AT").toLocalDateTime());
        stat.setPartnerFirstName(rs.getString("CONTACT_PERSON_FIRST_NAME"));
        stat.setPartnerLastName(rs.getString("CONTACT_PERSON_LAST_NAME"));
        stat.setAppNameDefault(rs.getString("VERSION_APP_NAME"));
        stat.setAppCatalogId(rs.getInt("APP_CATALOG_ID"));
        stat.setStatType(rs.getString("STATTYPE"));
        stat.setLogType(LogTypeEnum.valueOf(rs.getString("LOG_TYPE").trim()));
        stat.setAppCatalogVersionId(rs.getInt("APP_CATALOG_VERSION_ID"));
        stat.setVersion(rs.getInt("VERSION"));
        stat.setUpdatedAt(rs.getDate("UPDATED_AT"));
        stat.setVersionLogoExt(rs.getString("VERSION_LOGO_EXT"));
        stat.setHasLogo(rs.getBoolean("HAS_LOGO"));
        stat.setLanguageNameShort(rs.getString("LANGUAGE_NAME_SHORT"));
        stat.setLanguageId(rs.getInt("LANGUAGE_ID"));

        return stat;
    }
}

错误是:“PreparedStatementCallback;错误的 SQL 语法 [SELECT S.APP_ID, S.LOG_TYPE, ACC.CONTACT_PERSON_FIRST_NAME, ACC.CONTACT_PERSON_LAST_NAME, ACV.VERSION_APP_NAME, 'days30' STATTYPE, ACV.APP_CATALOG_ID, ACV.APP_CATALOG_VERSION_ID, ACV。 VERSION, ACV.UPDATED_AT, ACV.VERSION_LOGO_EXT, ACV.HAS_LOGO, LANG.LANGUAGE_NAME_SHORT, S.count, S.PARTNER_ID FROM (SELECT partner_id, log_type, app_id, language_id, count(*) as count FROM public.statistics_log WHERE logged_at 之间?和 ? group by 1, log_type, app_id, language_id, partner_id) as S INNER JOIN APP_CATALOG_ACCOUNT ACP ON ACP.APP_CATALOG_SERIAL_ID = S.APP_ID INNER JOIN APP_CATALOG APP ON APP.APP_CATALOG_SERIAL_ID = S.APP_ID INNER JOIN ACCOUNT ACC ON ACC.ACCOUNT_ID = S .PARTNER_ID INNER JOIN APP_CATALOG_VERSION ACV on ACV.APP_CATALOG_SERIAL_ID = APP.APP_CATALOG_SERIAL_ID AND ACV.STATUS = 3 INNER JOIN LANGUAGE LANG ON LANG.LANGUAGE_ID = ACV.LANGUAGE_ID ORDER BY S.count desc ];嵌套异常是 org.postgresql.util.PSQLException :在此 ResultSet 中找不到列名 CREATED_AT。"

在错误中似乎该字段不存在

如果您知道可能出了什么问题或我可以尝试的事情,请不要犹豫发表评论,即使是最小的帮助,我也将不胜感激。

【问题讨论】:

  • 这里没有错误。
  • 请发布您的错误的异常堆栈跟踪
  • 您似乎选择了一个名为 CREATED_AT 的列,因此,假设这是实际代码,没有理由期望该列在结果集中不可用。
  • 也许检索rs.getMetaData(),循环它并打印出列名?这可以提示您的结果集中有哪些列可用,以及为什么不采用CREATED_AT
  • @TheWhiteRabbit 所以不在结果集中,但我的意思是这就是错误试图告诉我们的,但我不明白为什么从控制台看来,这部分丢失了@987654328 @ ,这真的很奇怪

标签: java spring-jdbc


【解决方案1】:

我可以看到查询的第 2 行有一个错误 - + "'" + statType.trim() + "' STATTYPE, ",就在引号之后。 STATTYPE 没有表引用,并附加了一个字符串。那可能是另一个问题。我无法评论这个问题,因为我没有足够的声誉。

【讨论】:

  • STATTYPE 是正在选择的文本值的列别名,在本例中为“days30”。它不需要表引用,并且看起来像有效的语法。
猜你喜欢
  • 2014-02-11
  • 2021-03-02
  • 2019-10-26
  • 2018-09-23
  • 2021-01-18
  • 2016-01-27
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多