从JpaRepository方法返回一个布尔值

时间:2015-05-12 05:19:53

标签: java spring-data-jpa

我在扩展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)
...

6 个答案:

答案 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”