gpt4 book ai didi

java - 如果不为空则比较日期

转载 作者:行者123 更新时间:2023-11-29 12:23:45 25 4
gpt4 key购买 nike

我需要找到创建日期 > X 的所有记录。X 是一个 sql.Timestamp 并且可能为空,在这种情况下我只想返回所有记录。所以我尝试了:(createdAfter 是时间戳)

SELECT *
FROM sample AS s
WHERE s.isActive
AND (:createdAfter ISNULL OR s.insert_time > :createdAfter)

但我得到的只是

org.postgresql.util.PSQLException: ERROR: could not determine data type of parameter $1

但是,如果我在检查任意 int 是否为 null 时执行相同的查询:

SELECT * 
FROM trades
WHERE (:sInt ISNULL OR trades.insert_time > :createdAfter )

然后就可以了。怎么了?

最佳答案

如果您想坚持使用这样的原生查询,没有简单的解决方案。 null 值被转换为 bytea 值。参见示例 thisthis .

该值很难转换或与 timestamp 值进行比较。

问题不在于第一次比较,而是使用 coalesce 来处理,例如:

COALESCE(:createdAfter) ISNULL

因为实际值之间没有比较,数据类型无关紧要。但是比较

sometimestamp::timestamp > null::bytea(转换只是为了显示实际类型,所以不起作用)

在过程和异常处理等背后可能需要更多逻辑,不确定。

因此,如果 JPQL 或 CriteriaQueries 是不可能的,因为您只有不好的选择:

  • 通过字符串连接等设置参数来构造查询(不!并且不确定是否真的有效)
  • 使用PreparedStatement 查询,更多的代码和努力
  • 如果使用 Hibernate,也可以像 this answer 中那样使用 session API

关于java - 如果不为空则比较日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54168076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com