Java7下将Hibernate查询结果转为HashMap并直接生成目标字符串
你的问题解答:直接转换目标格式字符串完全可行!
嘿,针对你的场景——Java7 + Hibernate查询10万+记录,要转HashMap再生成[col1=val1 ,col2=val2,......]格式的字符串,完全可以直接实现,不过得兼顾性能和稳健性,毕竟数据量不小,咱们来一步步说:
首先,先优化你的SQL查询(重要!避免SQL注入)
你原来的SQL是直接拼接字符串,这存在严重的SQL注入风险,哪怕是内部系统也不推荐。Java7里Hibernate完全支持参数绑定,改成这样更安全:
String queryString = "SELECT distinct c.billing_account_no, concat(p.eligibility_id, c.seq_id) AS full_name " + "FROM Siebel_promo_prod_offer_fed p , ppm_offerability_account_info c " + "WHERE p.corp_code = :corpCode and p.ELIGIBILITY_ID = :ruleId"; List<List<Object>> accountIDs = session.createSQLQuery(queryString) .setParameter("corpCode", corpCode) .setParameter("ruleId", ruleId) .setResultTransformer(Transformers.TO_LIST) .list();
方案1:先转HashMap再生成目标字符串
如果你必须保留HashMap(比如后续还要用这个映射),那可以在转完Map后用StringBuilder高效拼接字符串(绝对不要用String直接拼接,10万+数据会严重拖慢性能):
// 初始化HashMap时指定容量,减少扩容开销 HashMap<String, String> map = new HashMap<>(accountIDs.size()); for(List<Object> x : accountIDs){ // 处理null值,避免类型转换异常 String billingNo = x.get(0) != null ? x.get(0).toString() : ""; String fullName = x.get(1) != null ? x.get(1).toString() : ""; map.put(billingNo, fullName); } // 生成目标格式字符串 StringBuilder sb = new StringBuilder("["); Iterator<Map.Entry<String, String>> entryIterator = map.entrySet().iterator(); while(entryIterator.hasNext()){ Map.Entry<String, String> entry = entryIterator.next(); sb.append("billing_account_no=").append(entry.getKey()) .append(", full_name=").append(entry.getValue()); if(entryIterator.hasNext()){ sb.append(", "); } } sb.append("]"); String finalResult = sb.toString();
方案2:直接遍历查询结果生成字符串(更高效,推荐大数据量场景)
如果不需要保留HashMap,直接遍历List<List<Object>>生成字符串能节省大量内存(10万+条数据的HashMap内存占用可不小),一步到位:
StringBuilder sb = new StringBuilder(); for(List<Object> x : accountIDs){ String billingNo = x.get(0) != null ? x.get(0).toString() : ""; String fullName = x.get(1) != null ? x.get(1).toString() : ""; sb.append("[billing_account_no=").append(billingNo) .append(", full_name=").append(fullName) .append("], "); } // 移除最后多余的逗号和空格 if(sb.length() > 2){ sb.setLength(sb.length() - 2); } String finalResult = sb.toString();
稳健性注意事项
- null值处理:一定要检查查询返回的字段是否为null,直接强转
(String)x.get(0)可能抛出NullPointerException,用toString()或者三元表达式兜底更安全。 - 性能优化:必须用
StringBuilder(单线程场景)或StringBuffer(多线程场景)做字符串拼接,String是不可变对象,每次拼接都会生成新实例,10万+数据下性能差距巨大。 - 内存控制:如果数据量超过JVM内存阈值,考虑分批查询(用
setFirstResult和setMaxResults分页),避免OOM。
内容的提问来源于stack exchange,提问作者neha tayal
相关产品推荐
相关产品推荐

