mysql数据库BigInt数据类型和实体对象中BigInteger,Long类型的冲突
实体Bean
public class Broke {
/**
* brokeid
*/
BigInteger brokeid;
/**
* 节点id 与 节点id为多对一的关系
*/
String nodeid;
/**
* brokeip
*/
String brokeip;
/**
* 删除标记 0--notdelete 1--delete (0 is default)
*/
int deleteflag = 0;
}
brokeid为BigInteger类型, 在mysql数据库中brokeid同样也为BigInteger类型,看起来如果在数据库中查找相关Broke实体应该没有什么问题,然而在查找出resultSet结果进行反射时,却抛出了argument type mismatch的错误信息。。下面看反射代码。。
public static <T> List<T> getObjectsList(ResultSet rs, Class<T> k)
throws SQLException {
List<T> bl = new ArrayList<T>();
if (rs != null) {
while (rs.next()) {
T o = null;
try {
o = k.newInstance();
for (Method m : k.getDeclaredMethods()) {
String name = m.getName();
if (name.startsWith("set")) {
// System.out.println(rs.getObject(name.substring(3)).getClass().getName());
m.invoke(o, rs.getObject(name.substring(3)));
}
}
bl.add(o);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return bl;
}
return null;
}
当程序运行时,将反射执行到Brokeid时,就会在红色程序部分抛出argument type mismatch的异常信息,打印出程序中注释掉的那句输出语句时,便可以判断出,此时,从resultSet对象中取出的object对象为Long类型。之后,将Broke实体中brokeid的数据类型改为Long即可。
在测试之后,发现改为Long类型之后,并不影响Broke对象的插入和其他一些相关操作。 而原先的BigInteger数据类型在添加实体的时候是可以的,但是在rs.getObject时,就会发生类型不匹配的错误。。