spring HQL -使用H2和MySQL在where子句中列出可以为null的列表

toe95027  于 2023-03-28  发布在  Spring
关注(0)|答案(1)|浏览(108)

我有以下Hibernate查询语言的代码:

@Query("SELECT a FROM Table a " +
            "WHERE (COALESCE(:param, null) IS NULL OR a.value in :param) "
    )
    List<InspectionInstruction> findAllInIds(@Param("param") List<Long> ids);

这个调用要么使用Id列表,要么只使用null。所以如果列表不为空,我想使用where子句,如果列表为空,我想省略where子句。实际的查询要大得多,有多个子句,所以将它们分开不是一个可行的选择。
它与MySQL(版本8)一起工作得很好,但是与H2一起使用时,我得到以下错误:

WARN [http-nio-auto-1-exec-4] --- o.h.e.j.s.SqlExceptionHelper: SQL Error: 50004, SQLState: HY004
ERROR [http-nio-auto-1-exec-4] --- o.h.e.j.s.SqlExceptionHelper: Unknown data type: "NULL, ?"; SQL statement:
select a0_.id as col_0_0_ from table a0_ where coalesce(?, null) is null or a0_.id in (?) [50004-214]

我的H2连接字符串:

url: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL 
    driverClassName: org.h2.Driver

有没有一种方法可以在H2中将可能的null值作为参数处理?如果有任何好处的话,我也可以传递一个空列表而不是null。

xoshrz7s

xoshrz7s1#

这不是我想要的答案,而是一个有效的答案:
我尝试了一些CriteriaBuilder实现,但由于整个项目都使用HQL,而且我也喜欢编写HQL语句,因为它们与SQL很接近,所以我最终这样做了:

@Query("SELECT a FROM Table a " +
            "WHERE (:paramEmpty IS TRUE OR a.value in :param) "
    )
    List<InspectionInstruction> findAllInIds(@Param("param") List<Long> ids, @Param("paramEmpty") boolean idsEmpty);

在我看来这是一个有点丑陋的方法,但它确实起到了作用。
我还发现了size()函数,很兴奋,但它不支持参数。

相关问题