用sql语句查出的字段顺序 和 查完放入list里的顺序不一样 。。

探讨了使用SQL查询多表数据时字段顺序变化的问题,提供了通过JavaBean封装查询结果来保持字段顺序的方法。

用sql语句查出的字段顺序 和 查完放入list里的顺序不一样 。。3

我的sql语句字段位置是这样的....  

select htbh, fbf, cbf, nian,yue, ri, qx_glq, qx_zyz, jbt_zw1 from .... 

可是查出来放进list里以后 字段位置就不是这样了..  
{jbt_zw1=水, yue=3, cbf=周鹏, qx_zyz=2, fbf=公司, ri=1, qx_glq=1, nian=2011, htbh=861} 

我想问下 怎么能变回sql里那样的顺序呢

问题补充:
AngelAndAngel 写道
应该不会这样啊 list是有序的。你把你封装成list的过程代码贴一下



public List chaList(String sql){ 
  List list=new ArrayList(); 
  JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource); 
  list=jdbcTemplate.queryForList(sql); 
  return list; 
}

问题补充:
AngelAndAngel 写道
你sql放到数据库客户端工具里面 是查出来有序的么?



我用的sql server 2000  用企业管理器查显示的和sql语句里是一样的顺序。。

问题补充:
AngelAndAngel 写道
你是把字段全部放在list里面哦



额 对啊  把查出来的所有东西都放list里。。

问题补充:
AngelAndAngel 写道
我怀疑是你的字段名有重复 或者不识别什么的,和ls所说,你都加个别名试试。



加完查出来的是这样的 
{f=1, g=1, d=2011, e=3, b=公司, c=周鹏, a=861, h=2, i=水} 

sql:select a.htbh a, a.fbf b, a.cbf c, a.nian d, a.yue e , a.ri f, a.qx_glq g , a.qx_zyz h, b.jbt_zw1 i from。。。

问题补充:
fmjsjx 写道
你用这个queryForList查出来的List里存放的都是HashMap,顺序当然会不一样。



额。。  那应该用什么查呢

问题补充:
fmjsjx 写道
一般是弄一个model出来,HashMap是别指望排序了,但是sql的顺序其实没什么意义,实再需要的话你就不要用HashMap的toString方法,自己按照顺序print就好了……



主要是我要把查出来的数据导出到excel里。。 用到了 

Java代码   收藏代码
  1. int rowIndex = 1;     
  2. int columnIndex = 0;     
  3. for (Map<String, String> row : list) {     
  4.    // row写入到excel;     
  5.       columnIndex = 0;     
  6.       Set<java.util.Map.Entry<String,String>>cellSet=row.entrySet();     
  7. for (java.util.Map.Entry<String, String> data : cellSet) {     
  8.      String d = data.getValue().toString();  
  9.      tring d = String.valueOf(data.getValue());  
  10.      label = new Label(columnIndex, rowIndex, d);     
  11.      try {     
  12.         sheet.addCell(label);  
  13.      } catch (Exception e) {     
  14.         throw new IOException(e.getMessage());     
  15.        }     
  16.          columnIndex++;     
  17.       }     
  18.      rowIndex++;     
  19.  }    

问题补充:
AngelAndAngel 写道
那你封装到javabean里面吧



我查的是多个表。。。     javabean可以封装多个表的字段么?。。 

以前就是一个表一个javabean没弄过多个表的。。 

应该怎么弄呢。。
2011年10月11日 09:26
给你武将吕布赵云,谋士诸葛亮庞统,你能统一三国?广告新数网络

12个答案按时间排序按投票排序

0 0

采纳的答案

引用
我查的是多个表。。。     javabean可以封装多个表的字段么?。。 

以前就是一个表一个javabean没弄过多个表的。。 

应该怎么弄呢。。

那你把这个javabean的字段覆盖所有你需要查的,相当于一个视图的bean了。

2011年10月11日 11:05
0 0

既然是查询出来写入excel,何不封装一个javabean呢,写excel操作javabean要比使用使用单个的字段方便多了

2011年10月11日 10:47
0 0

话说如果真的要顺序一致,其实也可以做到,就是比较麻烦,记得spring里有个query方法是可以传入一个处理结果集的接口实现的,只要你自己用LinkedHashMap实现一把就好了。

2011年10月11日 10:17
0 0

那你封装到javabean里面吧

2011年10月11日 10:13
0 0

一般是弄一个model出来,HashMap是别指望排序了,但是sql的顺序其实没什么意义,实再需要的话你就不要用HashMap的toString方法,自己按照顺序print就好了……

2011年10月11日 10:04
0 0

换个查询方式吧

2011年10月11日 10:01
0 0

你用这个queryForList查出来的List里存放的都是HashMap,顺序当然会不一样。

2011年10月11日 09:57
0 0

我怀疑是你的字段名有重复 或者不识别什么的,和ls所说,你都加个别名试试。

2011年10月11日 09:53
0 0

你是把字段全部放在list里面哦

2011年10月11日 09:45
0 0

给每个字段加上别名如: 
select htbh a, fbf b, cbf c, nian d,yue e, ri f, qx_glq g, qx_zyz h, jbt_zw1 from 。。.

2011年10月11日 09:36
0 0

你sql放到数据库客户端工具里面 是查出来有序的么?

2011年10月11日 09:35
0 0

应该不会这样啊 list是有序的。你把你封装成list的过程代码贴一下


<think>首先,用户的问题是基于之前的引用内容,他们想查找使用SQL语句递归查询所有下级部门ID并放入集合中的方法。引用提供了MySQLSQL递归查询的例子。 回顾系统级指令: - 回答必须使用中文。 - 行内数学表达式用 $...$,但这个问题涉及数学表达式。 - 独立公式用 $$...$$,但这可能需要。 - LaTeX语法正确。 - 生成相关问题。 - 引用段落末尾添加引用标识,如[^1]。 用户的问题是关于SQL递归查询的:如何用SQL语句递归查询所有下级部门ID并放入集合中。 从引用中: - 引用[1] 展示了MySQL的递归查询使用变量。 - 引用[2] 展示了使用WITH RECURSIVE的SQL递归查询(似乎是SQL标准)。 - 引用[3] 解释了递归查询的概念语法。 用户的具体需求:递归查询所有下级部门ID并放入集合中。在SQL中,"放入集合"可能意味着返回结果的集合,或者存储在一个变量或表中。 在SQL中,递归查询的结果通常返回为一个结果集。用户可能想返回所有下级ID的列表。 常见的SQL递归查询方法: 1. 使用WITH RECURSIVE(SQL标准,适用于MySQL 8.0+, PostgreSQL, SQL Server等)。 2. 使用变量(如在MySQL 5.7或更早版本)。 从引用[1][2],我可以提取示例。 结构化我的回答: 1. 解释递归查询的概念。 2. 提供SQL语句示例。 3. 说明如何"放入集合" – 这可能意味着返回为一个集合。 用户说"放入集合中",在SQL上下文中,可能指查询结果是一个集合,或者使用INTO来存储。 在SQL中,可以把结果存储在临时表或变量中。 但最简单的方式是展示递归查询如何返回所有ID。 参考引用[2],它使用WITH RECURSIVE。 引用[3]解释了一般语法。 我将基于引用[2]提供一个示例,因为它更标准。 创建一个清晰的回答: - 假设有一个部门表,如部门ID上级ID。 - 使用WITH RECURSIVE来查询所有下级。 问题涉及的数据库系统:用户引用中提到了MySQL,但引用[2]使用了WITH,这是SQL标准,MySQL 8.0支持。 在回答中,我应该指定数据库系统,或者提供通用方法。 用户上次问题是类似的,所以保持连贯。 生成相关问题: - 系统要求在每个回答末尾生成相关问题。 回答结构: - 先简洁解释方法。 - 提供SQL代码示例。 - 然后添加相关问题。 使用中文回答。 最终回答大纲: 1. 介绍:递归查询所有下级部门ID的方法。 2. 示例SQL语句:使用WITH RECURSIVE。 3. 解释如何返回集合。 4. 添加引用标识。 5. 生成相关问题。 SQL示例代码: - 基于引用[2]。 假设表结构:部门表(部门ID, 上级部门ID, 部门名称) SQL语句: ```sql WITH RECURSIVE DepHierarchy AS ( SELECT id, parent_id FROM departments WHERE id = ? -- 起始部门ID UNION ALL SELECT d.id, d.parent_id FROM departments d INNER JOIN DepHierarchy dh ON d.parent_id = dh.id ) SELECT id FROM DepHierarchy; ``` 这将返回所有下级部门ID。 用户在引用[1]中提到了放入集合,但那是一个查询结果。 在SQL中,可以使用GROUP_CONCAT或类似函数放入一个字符串集合,但通常是返回列表。 用户说"放入集合中",可能意味着在应用程序中处理,但SQL查询返回结果就可以了。 我会提供一个查询返回所有ID的集合。 引用末尾添加标识。 生成相关问题: - 例如: - 如何限制递归深度? - 递归查询的性能优化? - 其他数据库中递归查询的实现? 确保回答真实可靠。 </think>### 使用SQL递归查询所有下级部门ID的方法 在许多业务场景中,如组织架构管理,需要递归查询某个部门的所有下级部门ID,并将这些ID放入一个集合中以供后续使用(例如过滤数据或批量操作)。SQL递归查询是实现此需求的常用方法,它基于层次结构数据(如部门表)。以下是基于SQL标准(适用于MySQL 8.0+、PostgreSQLSQL Server等)的实现步骤示例。需要注意的是,"放入集合"在SQL中通常指返回一个结果集(集合);如果需要在应用程序中存储为集合变量,可以从查询结果中提取。 #### 实现步骤 1. **定义递归查询结构**:使用 `WITH RECURSIVE` 子句(SQL标准语法)初始化起始节点,并递归向下遍历所有子节点。 - **起始条件**:指定根部门ID(例如,要查询部门ID为1的所有下级)。 - **递归条件**:通过 `UNION ALL` 连接当前节点下级的子节点。 - **终止条件**:当没有更多下级节点时递归停止[^3]。 2. **返回ID集合**:查询结果直接返回所有下级部门ID的集合(无序列表)。如果需要排序或去重,可以使用 `ORDER BY` 或 `DISTINCT`。 3. **表结构假设**:基于常见设计,假设部门表名为 `departments`,包含字段: - `id`(部门ID,主键) - `parent_id`(上级部门ID,可为NULL表示根部门) - `name`(部门名称,可选) #### SQL语句示例 以下SQL示例使用 `WITH RECURSIVE` 查询所有下级部门ID,并将结果放入一个集合中(即返回一个ID列表)。您只需替换 `?` 为实际的起始部门ID(例如1)。 ```sql -- 递归查询所有下级部门ID,返回集合 WITH RECURSIVE DeptHierarchy AS ( -- 起始条件: 指定根部门ID SELECT id, parent_id FROM departments WHERE id = ? -- 替换为起始部门ID,如1 UNION ALL -- 递归条件: 通过JOIN连接下一级部门 SELECT d.id, d.parent_id FROM departments d INNER JOIN DeptHierarchy dh ON d.parent_id = dh.id -- 父子关系连接 ) SELECT id AS department_id -- 返回所有下级部门ID的集合 FROM DeptHierarchy; ``` #### 关键解释 - **起始部门ID**:在 `WHERE id = ?` 处指定要查询的根部门ID。 - **返回集合**:`SELECT id FROM DeptHierarchy` 输出所有下级ID的集合(例如,如果起始ID为1,结果可能是 `[2, 3, 4]`)。 - **性能考虑**:递归查询在深度较大的层次结构中可能较慢,建议索引 `parent_id` 字段以优化性能[^1][^3]。 - **适配同数据库**: - **MySQL 8.0+**:支持 `WITH RECURSIVE`,如上例。 - **MySQL 5.7或更早**:使用变量实现(类似引用[1]),但如标准语法直观。 - **其他场景**:如果需将ID存入临时表或变量,可添加 `INTO @variable`(MySQL)或 `CREATE TEMP TABLE`(PostgreSQL)[^2]。 #### 注意事项 - **循环引用处理**:如果部门数据存在循环(如A的上级是B,B的上级是A),递归可能无限循环。可通过设置最大深度(例如 `LIMIT 100`)或检测循环避免问题[^3]。 - **实际应用**:在应用程序中(如Java、Python),您可以直接将查询结果读入集合变量(如List或Set),无需在SQL中额外存储。 通过递归查询,您可以高效地处理层次数据,满足组织架构分析等需求[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值