gpt4 book ai didi

java - Spring 数据存储库将 null 作为 bytea 发送到 PostgreSQL 数据库

转载 作者:行者123 更新时间:2023-11-29 11:51:41 28 4
gpt4 key购买 nike

从 MySQL 切换到 PostgreSQL 后,我发现我的 SQL 查询(在 spring 数据存储库接口(interface)中的@Query)不再工作了。该问题是由作为 bytea 发送的 null 值引起的,我收到以下异常:

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: bigint = bytea
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

带有@Query 的存储库:

public interface WineRepository extends PagingAndSortingRepository<Wine, Long> {
@Query(value = "SELECT * FROM WINE w WHERE (?1 IS NULL OR w.id = ?1)", nativeQuery = true)
Wine simpleTest(Long id);
}

简单测试:

LOGGER.warn("test1: {}", wineRepository.simpleTest(1L));    //ok
LOGGER.warn("test2: {}", wineRepository.simpleTest(null)); //PSQLException

在实际情况下,我有多个可以为 null 的参数,我宁愿不在 java 代码中检查它们,而是将它们发送到 sql 查询。我在这里检查了关于 stackoverflow 的问题,但没有找到一个很好的答案,尤其是对于 spring 数据存储库 @query 注释。

使用 PostgreSQL 处理空值的正确方法是什么?或者您有任何提示可以解决我的方法吗?谢谢!

更新:问题似乎与 nativeQuery = true 有关,当值为 false 时,空值按预期工作。所以问题是是否有可能在启用 nativeQuery 的情况下使其正常运行。

最佳答案

试试这个。

SELECT *
FROM WINE w
WHERE ?1 IS NULL OR w.id = CAST(CAST(?1 AS TEXT) AS BIGINT)

它满足类型检查器并且应该具有与原始查询相同的属性。 CAST 如果发生在常量值而不是数据库行中的值上,则不会对性能造成很大影响。

关于java - Spring 数据存储库将 null 作为 bytea 发送到 PostgreSQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36834537/

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