带有'case at exists'的JPA @Query不适用于Hibernate

时间:2016-11-27 20:24:01

标签: java postgresql hibernate jpa hql

我有一个带有以下方法的@Repository接口,用于检查IF数据库是否包含记录冲突(在业务域中的含义) 我即将坚持(我不关心碰撞记录是什么):

@Query("select case when exists (
            select me from MyEntity me where {my conditions regarding someParam here}
        ) then true else false end from MyEntity")
boolean findColliding(@Param("someParam") String someParam);

我运行它的表是空的(PostgreSQL),因此存在子查询不应该找到任何内容,我相信整个方法应该返回false,因为 case 状态只有存在才能返回true,否则返回false。

它返回null #facepalm

我的查询在启动时传递查询语法检查(无QuerySyntaxException),但在执行时抛出异常:

org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public abstract boolean findColliding(...)

我做错了什么?我应该采取其他方法解决我的问题吗?

Hibernate 5.0.11.Final

1 个答案:

答案 0 :(得分:6)

JPA 2.1 CASE表达式only supports scalar expressions,而不是查询。

有关详细信息,请查看JPA specification

如果数据库支持此语法,则需要使用a native SQL query