Spring data repository 将 null 作为 bytea 发送到 PostgreSQL 数据库

从MySQL切换到PostgreSQL后,我发现我的SQL查询(@Query spring数据存储库接口中)不再工作。该问题是由值作为 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查询。我已经检查了stackoverflow上的问题,但没有找到一个很好的答案,特别是对于春季数据存储库@query注释。

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

更新:问题似乎与 有关,当值为 false 时,null 值按预期工作。因此,问题是,即使启用了nativeQuery,是否有可能使其正常运行。nativeQuery = true


答案 1

试试这个。

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

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


答案 2

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

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

推荐