PostgreSql表主键不是第一个时getGeneratedKeys方法报错的问题

当PgSQL的表 主键不是在表的第一个栏位的时候 getGeneratedKeys方法报错的问题

导致 Model.java

需要做出下列修改

/**
 * Get id after save method.
 */
private void getGeneratedKey(PreparedStatement pst, Table table, Config config) throws SQLException {
	String[] pKeys = table.getPrimaryKey();
	ResultSet rs = pst.getGeneratedKeys();
	for (String pKey : pKeys) {
		if (get(pKey) == null || config.dialect.isOracle()) {
			if (rs.next()) {
				Class colType = table.getColumnType(pKey);
				//由于Postgresql的getGeneratedKeys返回的是所有的数据所以这里不能用index的方式获取 应该用主键名称获取
				if (colType == Integer.class || colType == int.class)
					set(pKey, rs.getInt(1)); 改为 set(pKey, rs.getInt(pKey));
				else if (colType == Long.class || colType == long.class)
					set(pKey, rs.getLong(1)); 改为 set(pKey, rs.getLong(pKey));
				else
					set(pKey, rs.getObject(1)); 改为 set(pKey, rs.getObject(pKey));		// It returns Long object for int colType
			}
		}
	}
	rs.close();
}


评论区

502647092

2017-04-08 14:42

JFinal

2017-04-08 16:50

这个是不是在 qq 里面讨论过的问题? 我记得当时是建议你添加一个 if 分支,那个方法不可以?

上面的改进是不是就是将 getXXX(int) 改为 getXXX(String) ? 这种搞法不知道在 mysql 中可不可靠?

502647092

2017-04-08 17:38

因为PgSQL返回的结果是这次插入的所有数据 所以 不能根据第一个字段来获取 只能通过key 或者加一个判断dialect 如果过是pg就用getXXX(String) 否则就用getXXX(int)

502647092

2017-04-10 11:02

热门反馈

扫码入社