【问题标题】:Get the number of ip between a series of dates with jdbctemplate用jdbctemplate获取一系列日期之间的ip个数
【发布时间】:2021-11-28 17:43:45
【问题描述】:

我有这张桌子:

CREATE TABLE IF NOT EXISTS client (
    id BIGSERIAL NOT NULL,
    ip VARCHAR(39) NOT NULL, -- 7+8x4=39
    data TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT client_pk PRIMARY KEY(id),
    CONSTRAINT client_uk UNIQUE (ip)
);

我想搜索两个不同日期之间的记录数:

@Transactional(readOnly=true)
public Long trovaIpTraDateEdOre(LocalDateTime dataOraInizialeInclusa, LocalDateTime dataOraFinaleEsclusa) {
    try{
        String sql = "SELECT COUNT(*) FROM client WHERE data >= TIMESTAMP WITH TIME ZONE ? AND data < TIMESTAMP WITH TIME ZONE ?;";
        int[] tipi = {Types.TIMESTAMP_WITH_TIMEZONE, Types.TIMESTAMP_WITH_TIMEZONE};
        return jdbcTemplate.queryForObject(sql, Long.class, tipi);
    }catch (Exception e){
        return null;
    }
}

如果我运行这个查询,我会得到 7,所以问题出在其他地方:

SELECT COUNT(*) FROM client WHERE data >= TIMESTAMP WITH TIME ZONE '2021-10-07T00:00' AND data < TIMESTAMP WITH TIME ZONE '2022-01-01T00:00';

我不明白如何处理 LocalDateTime。

我得到'null'。在“尝试”循环中,我得到:

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT COUNT(*) FROM client WHERE data >= TIMESTAMP WITH TIME ZONE ? AND data < TIMESTAMP WITH TIME ZONE ?;]; Nessun valore specificato come parametro 2.; nested exception is org.postgresql.util.PSQLException: Nessun valore specificato come parametro 2.

【问题讨论】:

  • 你遇到了什么错误?
  • 我得到 org.springframework.dao.DataIntegrityViolationException。我在帖子中添加了错误。
  • 对于jdbc类型TIMESTAMP_WITH_TIMEZONE应该使用java.time.OffsetDatetime,参考jdbc specification B.4 Java Object Types Mapped to JDBC Types
  • 非常感谢您的反馈,我做了这个更改,但我没有解决:public Long trovaIpTraDateEdOre(OffsetDateTime dataOraInizialeInclusa, OffsetDateTime dataOraFinaleEsclusa) { 我忘记了什么?我得到同样的错误。

标签: postgresql spring-boot date jdbctemplate localdatetime


【解决方案1】:

您的方法没有使用您通过dataOraInizialeInclusadataOraFinaleEsclusa 传递的参数。您需要将其重写为以下内容:

String sql = "SELECT COUNT(*) FROM client WHERE data >= :from AND data < :to";
Map<String, Object> params = new HashMap<>();
params.put("from", dataOraInizialeInclusa);
params.put("to", dataOraFinaleEsclusa);
return jdbcTemplate.queryForObject(sql, params, Integer.class);

我返回一个整数,因为我不知道 Long 是否会工作(我想它会),并且当你返回一个计数时,Integer 会更有意义(imo)。您不需要向 SQL 查询添加强制转换,因为 postgres jdbc 驱动程序应该推断出正确的数据类型,只要您没有使用太旧的版本。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2010-11-25
    • 2014-04-19
    • 2018-09-17
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多