使用@Query JPA批注将null参数传递给本机查询

Nih*_*ish 4 postgresql hibernate jpa spring-boot

在Spring Boot应用程序中,我有一个在postgresql服务器上执行的SQL查询,如下所示:

@Query(value = "select count(*) from servers where brand= coalesce(?1, brand) " +
        "and flavour= coalesce(?2, flavour) ; ",
        nativeQuery = true)
Integer icecreamStockCount(String country, String category);
Run Code Online (Sandbox Code Playgroud)

然而,

执行该方法时出现以下错误:

ERROR: COALESCE types bytea and character varying in PostgreSQL

如何将String value = null传递给查询?

**注意:**我发现我的问题从JPA查询变化为处理NULL参数值

And*_*nyk 5

您不需要合并,试试这个

@Query("select count(*) from servers where (brand = ?1 or ?1 is null)" +
        " and (flavour = ?2 or ?2 is null)")
Integer icecreamStockCount(String country, String category);
Run Code Online (Sandbox Code Playgroud)


Jod*_*iug 5

当我中遇到这个错误,我最终使用的组合ORCAST解决的问题。

SELECT COUNT(*)
FROM servers
WHERE (?1 IS NULL OR brand = CAST(?1 AS CHARACTER VARYING))
AND (?2 IS NULL OR flavour = CAST(?2 AS CHARACTER VARYING))
Run Code Online (Sandbox Code Playgroud)

即使、和都是可为空的字段?1,这也有效。?2brandflavor

请注意,传递null?1意味着“所有服务器不分品牌”而不是“所有服务器都没有品牌”。对于后者,您可以IS DISTINCT FROM按如下方式使用。

SELECT COUNT(*)
FROM servers
WHERE (CAST(?1 AS CHARACTER VARYING) IS NOT DISTINCT FROM brand)
AND (CAST(?2 AS CHARACTER VARYING) IS NOT DISTINCT FROM flavour)
Run Code Online (Sandbox Code Playgroud)

最后,某些参数类型(例如Boolean不能在 SQL 中BYTEA转换BOOLEAN为from to ,对于这些情况,您需要双重转换:

SELECT COUNT(*)
FROM servers
WHERE (?1 IS NULL OR is_black = CAST(CAST(?1 AS CHARACTER VARYING) AS BOOLEAN))
Run Code Online (Sandbox Code Playgroud)

在我看来,这是 Hibernate 中的一个问题,可以通过将 Javanull参数作为普通 SQL传递NULL而不是解释null为 type 值来解决BYTEA