使用 jdbctemplate 获取一系列日期之间的 ip 数
Get the number of ip between a series of dates with jdbctemplate
我有这个table:
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'。在 'try' 循环中我得到:
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.
您的方法没有使用您传递给 dataOraInizialeInclusa
和 dataOraFinaleEsclusa
的参数。您需要将其重写为如下内容:
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 驱动程序 应该 推断正确的数据类型,只要您不使用版本太旧了。
我有这个table:
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'。在 'try' 循环中我得到:
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.
您的方法没有使用您传递给 dataOraInizialeInclusa
和 dataOraFinaleEsclusa
的参数。您需要将其重写为如下内容:
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 驱动程序 应该 推断正确的数据类型,只要您不使用版本太旧了。