我有一个SQL表,其中存储了一个具有主键(我称之为id)的对象。我有一个方法,用于从SQL表中收集列值并创建所述对象(DB中的每一行对应于java中的一个对象)。
例如,
ArrayList<Object> objectList = new ArrayList<Object>();
Connection connection = createNewConnectionToDatabse();
PreparedStatement statement = connection.prepareStatement("SELECT * FROM objects;");
ResultSet rs = statement.executeQuery();
while(rs.next()){
Object obj = new Obj(rs.getInt(1)); // rs.getInt(1) should return the integer id for the column...
objectList.add(obj);
}
return objectList;
在过去的几个小时里,这一切都很顺利,但是由于某种原因,几分钟前,java开始将列id的结果作为long而不是int来处理。现在,我不断收到一个错误,即我无法将int转换为long,但在它将列id作为int返回之前。为什么JDBC不将SQL数据库中的int作为int返回?
我也试着把long转换成int,但是1)这仍然不能解释为什么代码以前工作得很好,现在它停止工作了,2)诚实地转换并不能解决这里的根本问题。
任何帮助都将不胜感激。谢谢。
2条答案
按热度按时间kmb7vmvb1#
所以我意识到问题在于我使用的是Integer类(我需要访问空值),因此
rs.getInt()
不能满足我的问题,因为rs.getInt()
在检测到空值时将抛出空指针异常(我的数据库将会有),所以我使用(Integer) rs.getObject(1)
来获取表的第一列中的id值。由于某种原因,当rs.getObject(1)
在数据库中检测到一个数字值时,它返回了一个Long而不是一个int。解决方案碰巧是我们rs.getObject(1, Integer.class)
,这完全解决了这个问题,并允许我继续使用null和整数。lc8prwob2#
getObject(int)
返回的值的类型由SQL列类型和JDBC驱动程序确定。对于MySQL,位于6.5 Java, JDBC, and MySQL Types的Connector/J 8.x文档指出INTEGER UNSIGNED
和BIGINT
1Map到Long
。MySQL的
BIGINT
实际上是一个64位有符号整数,所以这是有意义的。