遇见,的gravatar头像
遇见, 2014-09-30 17:39:27

JAVA查询oracle数据库返回字段顺序不一致的问题

SELECT ID, NAME, TITLE FROM AA;

从ORACLE直接查询 字段排列为

JAVA查询oracle数据库返回字段顺序不一致的问题

但是如果从JAVA中去执行这个SQL语句  用的spring jdbc

返回LIST就是乱序的了

[{NAME="", TITLE="", ID=""}]

有谁知道怎么能让和PLSQL一样的有序效果吗

所有回答列表(7)
遇见,的gravatar头像
遇见,  LV36 2014年10月7日

    这个问题困扰我好久了, 以前也去看过jdbc源码  只知道Field类里面是有列的数量和列的序号以及列名和别名的, 但是ResultSetImpl并没有提供获取Field的方法,当时郁闷了很久, 一度都想改源码了, 最后想尽各种办法没有解决,只能再看源码了,  发现ResultSetImpl提供了getMetaData()方法,该方法可以获取到ResultSetMetaData对象中具有获取Field属性的方法。最后我用LinkedHashMap来存储了查询出来的一行数据,下面是封装的方法,跟大家分享一下(基于spring jdbc 道理和普通jdbc一样)。

	public Map getOrderedRow(String sql, Object... param)
	{
		SqlRowSet rs = this.getJdbcTemplate().queryForRowSet(sql, param);
		if(rs == null) {
			return null;
		}
		Map result = new LinkedHashMap();
		int columnCount = rs.getMetaData().getColumnCount();
		for(int i=1; i<=columnCount; i++) {
			//rs.getMetaData().getColumnName(i) 获取不到别名   改用getColumnLabel
			//rs.first()判断是否有数据
			result.put(rs.getMetaData().getColumnLabel(i), rs.first() ? rs.getString(i) : null);
		}
		return result;
	}

 

评论(4) 最佳答案
mantis1046的gravatar头像
mantis1046  LV2 2014年10月1日

同问,等回答

jackzhang的gravatar头像
jackzhang  LV2 2014年10月1日

厉害

最代码官方的gravatar头像
最代码官方  LV168 2014年10月1日

客户端查询显示的列顺序是和建表的时候列顺序一致的,我在mysql上测试过,不知道oracle是否如此,你验证下。

JAVA查询oracle数据库返回字段顺序不一致的问题

JAVA查询oracle数据库返回字段顺序不一致的问题

另外关于java jdbc查询数据库获取字段的顺序问题

com.mysql.jdbc.JDBC4ResultSet返回的ResultSet中fields的顺序也是和建表的列顺序一致。

通过java获取的时候无所谓顺序了吧。

PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
String result = "";
while (rs.next()) {
	String id = rs.getString("id");
	String name = rs.getString("name");
	String pwd = rs.getString("pwd");
	result += id + "\t" + name + "\t" + pwd + "\n";
}
George的gravatar头像
George  LV26 2014年10月8日

程序查询得到结果类型Map直接get("key")就行了

sayHelloWorld的gravatar头像
sayHelloWorld  LV22 2014年10月16日

sql语句用order by,我也遇到过

qingyezhu的gravatar头像
qingyezhu  LV2 2014年10月22日

若是将结果存储在HashMap中,最后极有与数据库中排序结果不同,因为HashMap最后是按其Key的Hash值排序的;最好是用LinkedHashMap,其是继承了HashMap,并且维护一个双向链表,用于记录当前元素以及其上一个元素和其下一个元素,故能够记录下其添加进来的顺序。

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友