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

rho*_*ath 13 java postgresql hibernate spring-data spring-data-jpa

从 MySQL 切换到PostgreSQL 后,我发现我的 SQL 查询(spring 数据存储库界面中的 @Query)不再起作用。该问题是由作为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.
Run Code Online (Sandbox Code Playgroud)

带有@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);
}
Run Code Online (Sandbox Code Playgroud)

简单测试:

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

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

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

更新: 问题似乎与nativeQuery = true当值为 false 时空值按预期工作有关。所以问题是即使启用了 nativeQuery 是否有可能让它发挥作用。

Jod*_*iug 11

尝试这个。

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

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


sha*_*zin 0

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

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

  • 但我的目的是检查 Java 的输入是否为空。我不想从数据库中选择空值。 (6认同)