我在扩展JpaRepository
的界面中有一个本机查询。理想情况下,该方法应返回一个布尔值,但我无法弄清楚如何选择任何自动转换为boolean
的内容。
这有效,但我必须将其称为Boolean.valueOf(hasKids(id))
:
// yuck. I wanted a boolean
@Query(nativeQuery = true, value = "select 'true' from dual where exists("
+ "select * from child_table where parent_id = ?)")
String hasKids(long parentId);
如何将其更改为更自然的返回类型?
boolean hasKids(long parentId); // throws ClassCastException
更新
堆栈跟踪不是很有用恕我直言,因为它是Hibernate代理和AspectJ闭包的常见噩梦,但无论如何这里都是相关部分。Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at com.sun.proxy.$Proxy1025.hasKids(Unknown Source)
at com.bela.foo.bar.Service.ThingyServiceImpl.recordHasKids_aroundBody4(ThingyServiceImpl.java:85)
at com.bela.foo.bar.Service.ThingyServiceImpl$AjcClosure5.run(ThingyServiceImpl.java:1)
...
答案 0 :(得分:4)
我认为您要检查父ID的行是否存在,并在此基础上返回true和false,然后转到 case 。
在查询中进行的更改
"select case when (count(*) >0) then true else false end from dual where exists("
+ "select * from child_table where parent_id = ?)
答案 1 :(得分:3)
我遇到了类似的问题。我的解决方案是使用java.lang.Boolean。
的投影@Query("select new java.lang.Boolean(count(*) > 0) from child_table where parent_id = ?")
Boolean hasKids(long parentId);
希望这有助于某人。
答案 2 :(得分:1)
我通过删除围绕true的单引号来测试这个,并且它可以工作。
@Query(nativeQuery = true, value = "select true from dual where exists("
+ "select * from child_table where parent_id = ?)")
String hasKids(long parentId);
答案 3 :(得分:1)
在Oracle约束和此处所有建议的结合下,我找到了一种适用于我的情况的解决方案,而无需调用Boolean.valueOf(hasKids(id)):
@Query(nativeQuery = true, value = "select case when exists(select * from child_table "
+ "where parent_id = :parentId) then 'true' else 'false' end from dual")
Boolean hasKids(@Param("parentId") long parentId);
答案 4 :(得分:0)
实际上查询应该是这样的:
@Query("SELECT CASE WHEN COUNT(u) > 0 THEN true ELSE false END FROM User u WHERE rs = :user")
boolean userExsist(@Param("user") User user);
当然,对于上述示例,仅在您要运行自定义查询时有效。
答案 5 :(得分:-2)
似乎存在一个问题,至少与mysql有关 (count()> 0)当查询非本机时,转换为布尔值 (count()> 0)当查询是本机时返回“BigInteger不能转换为java.lang.Boolean”