我有一个带有以下方法的@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
答案 0 :(得分:6)
JPA 2.1 CASE表达式only supports scalar expressions,而不是查询。
有关详细信息,请查看JPA specification。
如果数据库支持此语法,则需要使用a native SQL query。