无法从结果集中读取列值;字符串索引超出范围:0
时间:2020-03-06 15:01:22 来源:igfitidea点击:
我正在使用Hibernate SQL查询从表(从MySQL数据库)读取数据。
事实是,该表包含一个列,该列已映射到Hibernate Model中的char,有时此列为空。
我想这就是我的例外来自何处。
如何在不出现此错误的情况下将一列char映射到我的休眠模型?
感谢回答!
谢谢回答 !
我的列不可为空(我正在使用MySQL,并且此列不可为空)
那我不认为
if (str == null) {
是适当的。
错误是:
15:30:35,289 INFO CharacterType:178 - could not read column value from result set: LSFUS11_20_; String index out of range: 0
这导致以下异常:
java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(String.java:558)
我想我可以尝试解决方案,但是:
if (str == "") {
因为它不能为null,所以它只是一个空的String。
感谢邮政编码,我将尝试尝试!
解决方案
我从问题假设我们正在将此映射到原始字符。下次,请发布我们收到的堆栈跟踪信息(我们可以在调用它的地方省略,如果项目过于敏感,则只能包含休眠的内容)。
如果确实映射到基本字符,并且它为null,则将出现异常,因为基本不能分配null。
此类将减轻这种情况," null"字符作为代表" 0"的字符返回。我们可以根据自己的喜好对其进行自定义:
import java.sql.ResultSet; import java.sql.SQLException; import org.hibernate.type.CharacterType; public class NullCharacterType extends CharacterType { /** * Serializable ID generated by Eclipse */ private static final long serialVersionUID = 1L; public NullCharacterType() { super(); } public Object get(final ResultSet rs, final String name) throws SQLException { final String str = rs.getString(name); if (str == null || str.length() == 0) { return new Character((char) 0); } else { return new Character(str.charAt(0)); } } }
要在休眠映射中使用这种新类型,请先执行以下操作:
<property name="theChar" type="character">
现在,只需将类名指定为类型:
<property name="theChar" type="yourpackage.NullCharacterType">
但是,最佳实践是不要将原始类型用于数据库映射。如果可能的话,请使用Character而不是char,因为那样我们就不会有null问题(可以将null分配给包装器类型)。
在JBoss(服务器)中搜索lib文件中是否存在" mysql.jar"(mysql-connector-java-5.1.7-bin)。
即使我也遇到了同样的问题,在添加了mysql.jar文件之后,它仍然可以正常工作。