如何检查Hibernate自定义数据类型的IS NULL

l7mqbcuq  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(187)

我在Sping Boot 3中遇到了一个Hibernate自定义数据类型(AttributeConverter)的问题,我已经写了一个转换器,一个注解,一个验证器,描述符等。到目前为止一切正常。
现在,我在JPA repo中编写了一个非常简单的SQL,我想知道它是否不起作用:

@Query("SELECT a FROM #{#entityName} a WHERE ((:#{#iValue} IS NULL AND a.value IS NULL) OR a.value = :#{#iValue})")
MyEntity findByValue(@Param("iValue") MyDataType value)

并获得错误消息:

org.springframework.orm.jpa.JpaSystemException: Could not determine recommended JdbcType for org.example.MyDataType

我现在发现它是基于NULL的检查,并且值不是NULL。
这意味着如果value == null,上层查询可以正常工作,而不会出现错误消息。如果value != null,则会出现上述错误消息。
1.问题,我还需要在哪里输入什么,以便检查!= null。
1.有没有比((:#{#iValue} IS NULL AND a.value IS NULL) OR a.value = :#{#iValue})更优雅的方法。a.value = :#{#iValue}不适用于空值。如果值为NULL,Hibernate不会自动将其转换为IS NULL。我在互联网上没有找到任何不同的解决方法。
编辑:看起来这个bug又复活了。它曾经被解决过,现在在Hibernate 6中只是反向复活了。
https://github.com/spring-projects/spring-data-jpa/issues/2549
https://hibernate.atlassian.net/browse/HHH-8697
https://hibernate.atlassian.net/browse/HHH-9901
https://hibernate.atlassian.net/browse/HHH-9320

tpxzln5u

tpxzln5u1#

解决办法是:

@Query("SELECT a FROM #{#entityName} a WHERE ((:iValue IS NULL AND a.value IS NULL) OR a.value = :iValue)")
MyEntity findByValue(@Param("iValue") MyDataType value)

#{#...}

相关问题