Postgres 重叠符号未在 Java 中运行



我有一个查询,可以根据表中的两个时间戳列测试两个日期是否重叠。 查询在数据库客户端中工作正常,但是当我将其添加到Java代码中时,它失败并出现异常错误。 我需要知道如何格式化查询中的 && 符号才能工作。

SELECT count(*) 
FROM attendance_jobs 
WHERE tsrange( start_date, end_date) && tsrange(TIMESTAMP '2019-04-22', TIMESTAMP '2019-03-22 ')

这是我的java代码:

long count = jdbi.withHandle(handle -> {
return handle.createQuery("select count(*) from attendance_jobs where tsrange(start_date, end_date) && tsrange(timestamp :start_date, timestamp :end_date)")
.bind("start_date", start_date)
.bind("end_date", end_date)
.mapTo(Long.class)
.findOnly();
});

start_dateend_date数据类型为时间戳。

org.jdbi.v3.core.statement.UnableToExecuteStatementException: org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

这只是猜测,但我认为您应该再次查看:start_date:end_date的用法:

如果start_dateend_date(java 变量)的类型为 Timestamp,则应在查询中删除 :start_date:end_date时间戳前缀。正如文档所说,jdbi 支持 java 类型Timestamp

开箱即用,Jdbi 支持以下类型作为 SQL 语句参数:
* ...
* java.sql:blob、clob、date、time and timestamp
* ...

所以我的猜测是你必须像这样使用查询:

long count = jdbi.withHandle(handle -> {
return handle.createQuery("select count(*) from attendance_jobs where tsrange(start_date, end_date) && tsrange(:start_date, :end_date)")
.bind("start_date", start_date)
.bind("end_date", end_date)
.mapTo(Long.class)
.findOnly();
});

另外,但这可能是个人口味,我建议使用绑定变量和数据库列的不同拼写。后者带有下划线(就像您所做的那样),另一个带有骆驼大小写,因此如果您使用相似的名称,则不会那么令人困惑。此外,在 java 变量中使用下划线并不常见,因此代码在我的拼写中看起来与此类似:

Timestamp startDate = ...;
Timestamp endDate = ...;
String queryString = "select count(*) from attendance_jobs "
+ "where tsrange(start_date, end_date) && tsrange(:startDate, :endDate)";
long count = jdbi.withHandle(handle -> {
return handle.createQuery(queryString)
.bind("startDate", startDate)
.bind("endDate", endDate)
.mapTo(Long.class)
.findOnly();
});

最新更新