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

Posted

技术标签:

【中文标题】Spring 数据存储库将 null 作为 bytea 发送到 PostgreSQL 数据库【英文标题】:Spring data repository sends null as bytea to PostgreSQL database 【发布时间】:2016-08-18 11:42:27 【问题描述】:

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

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

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

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

更新: 问题似乎与 nativeQuery = true 有关,当值为 false 时,空值按预期工作。所以问题是即使启用了 nativeQuery 是否也可以使其正常工作。

【问题讨论】:

【参考方案1】:

试试这个。

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

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

【讨论】:

【参考方案2】:

我知道这是一个老问题,但您应该能够修复那个转换 java 值的托架。比如:

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

【讨论】:

【参考方案3】:

我在@Query 中遇到了类似的问题,Postgres 将 Long 解释为字节茶。对我来说,解决方案是拆箱 @Param...通过传递一个 long 值,Postgres 正确地将该值解释为一个 bigint

【讨论】:

【参考方案4】:

您正在尝试检查 Java null 是否等于 Postgres NULL,我认为这是不必要的。您可以重写如下,完全避免向simpleTest 函数发送空值。

@Query(value = "SELECT * FROM WINE w WHERE (w.id IS NULL OR w.id = ?1)", nativeQuery = true)
Wine simpleTest(Long id);

【讨论】:

但我的目的是检查来自 Java 的输入是否为空。我不想从数据库中选择空值。

以上是关于Spring 数据存储库将 null 作为 bytea 发送到 PostgreSQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用spring JPA存储库保存@lob数据

如何使用网站开放库将信息存储到数据库中[关闭]

如何使用 SQFLite 或 Moor 库将 JSON 数据存储到颤振中的数据库表中

存储库在 Spring Security 中返回 null

使用 .Net 库将 CSV 文件上传到 Google Cloud Storage

在 Spring Boot 中使用嵌入式数据库进行测试