【问题标题】:JpaRepository - Hibernate - java.math.BigInteger cannot be cast to java.lang.BooleanJpaRepository - Hibernate - java.math.BigInteger 不能转换为 java.lang.Boolean
【发布时间】:2020-08-20 14:20:52
【问题描述】:

我已经按照本教程 https://codingexplained.com/coding/java/spring-framework/return-boolean-value-from-spring-data-jpa-query 进行了操作,他在那里解释了如何从 JpaRepository 返回布尔类型,这样就完成了:

    @Transactional
    @Override
    @Query(value = "SELECT CASE WHEN COUNT(*) = 1 THEN true ELSE false END FROM admins WHERE admins.admin_name = 'admin' AND admins.password = 'admin'", nativeQuery = true)
    boolean IsBaseAdminAccountExist();

这东西正在扔exception is java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Boolean

【问题讨论】:

  • 哪个数据库?
  • mysql.有关系吗?

标签: java hibernate jpa spring-data-jpa spring-data


【解决方案1】:

同样的错误,我分享我的解决方案:

当您构建查询并强制转换为真或假时,它必须用引号引起来,如下所示:

@Query(value = "SELECT CASE WHEN COUNT(*) = 1 THEN 'true' ELSE 'false' END FROM admins WHERE admins.admin_name = 'admin' AND admins.password = 'admin'", nativeQuery = true)
boolean IsBaseAdminAccountExist();

另外,我建议使用 MYSQL IF 条件来简化您的查询,它看起来像这样:

@Query(value = "SELECT IF(COUNT(*) > 0, 'true', 'false') FROM admins WHERE admins.admin_name = 'admin' AND admins.password = 'admin'", nativeQuery = true)
boolean IsBaseAdminAccountExist();

【讨论】:

    【解决方案2】:

    这里没有理由使用本机查询。自 JPA 2.0 起,JPQL 支持 select case

    此外,此查询是只读的,因此不需要@Transactional

    试试这个

        @Override
        @Query(value = "SELECT CASE WHEN COUNT(*) = 1 THEN true ELSE false END FROM admins a WHERE a.adminName = 'admin' AND a.password = 'admin'")
        boolean IsBaseAdminAccountExist();
    

    我在这里假设 admin_name 是 db 中的列名,但在您的实体中,该字段遵循 java 命名约定 adminName ...

    【讨论】:

    • 感谢它的工作,但在我将其更改为非本机查询之前我还有一个问题,它在 MySQL 上不起作用,但在我与 H2 数据库的集成测试中,它为什么起作用?
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2012-03-19
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多