Java类型转换异常:BigInteger无法转为Boolean问题求助
不修改SQL语句解决exists查询的BigInteger转Boolean异常
问题根源
SQL的exists查询在JDBC中会返回BigInteger类型的结果:存在匹配数据时返回1,不存在时返回0。直接将这个结果映射到Boolean类型的方法返回值,会触发java.math.BigInteger cannot be cast to class java.lang.Boolean异常。
不修改SQL的解决办法
方法1:修改返回类型为BigInteger,业务层手动转换
仅修改Repository方法的返回类型(SQL语句保持不变),然后在业务代码里将数值结果转换成布尔值:
// Repository层代码(SQL未修改,仅调整返回类型) @Query(value = "select exists(select name,building from meetingroom where building=?1 and name=?2)",nativeQuery = true) BigInteger existsByRoom(String building,String name);
业务层处理逻辑示例:
BigInteger result = meetingRoomRepo.existsByRoom("A栋", "301会议室"); boolean roomExists = result.equals(BigInteger.ONE); // 后续根据roomExists判断是否执行数据保存操作
方法2:用全局属性转换器自动转换
定义一个JPA属性转换器,让框架自动完成BigInteger到Boolean的类型转换,无需修改原Repository方法:
import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.math.BigInteger; @Converter(autoApply = true) // autoApply=true 让转换器全局生效 public class BigIntegerToBooleanConverter implements AttributeConverter<BigInteger, Boolean> { @Override public Boolean convertToDatabaseColumn(BigInteger source) { return source != null && source.equals(BigInteger.ONE); } @Override public BigInteger convertToEntityAttribute(Boolean source) { return source != null && source ? BigInteger.ONE : BigInteger.ZERO; } }
定义完成后,原Repository方法无需任何调整,框架会自动处理类型转换,返回正确的Boolean值。
内容的提问来源于stack exchange,提问作者Krithi
相关产品推荐
相关产品推荐

