java - 如何提高迭代循环的性能
问题描述
我有一个 java 方法可以找到父母的所有孩子(叶子)。它工作正常。但存在性能问题。我怎样才能让它更快地工作?孩子长大了,问题就来了。这是方法:
Private void getChildren(String orgId, List<String> children, List<String> organs, int j){
Query query= entityManager.createNativeQuery("select c.organization_id from organization c where c.parent_org_id="+orgId);
if(query.getResultList().size()>0)
organs.addAll((List<String>) query.getResultList());
else
children.add(orgId);
for(int i=j+1; i<organs.size();i++){
j=i;
query=entityManager.createNativeQuery("select c.organization_id from organization c where c.parent_org_id="+String.valueOf(organs.get(i)));
if(query.getResultList().size()>0)
organs.addAll((List<String>) query.getResultList());
else
children.add(String.valueOf(organs.get(i)));
}
}
我称这种方法为
getChildren("68",new ArrayList<>(),new ArrayList<>(),-1)
我有 oracle 作为数据库,所以如果通过 oracle 查询更好地实现这一点,请注意我。顺便说一句,我的春季版本不支持流!
解决方案
您基本上有一个 1+N 选择问题(为您的集合中的每个 id 发出一个查询)。不要这样做,而是使用该IN
子句并发出单个查询!。
您不应该做的另一件事是使用 concat 创建查询,永远不要这样做!您应该做的只是返回结果并使用带有IN
子句的查询。
String query = "select c.organization_id from organization c where c.parent_org_id IN (:ids))
return em.createNativeQuery(query).setParameters("ids", organs);
甚至更好地完全使用单个查询。您可以为此使用自加入)
String query = "SELECT c1.organization_id " +
"FROM organization c1 LEFT OUTER JOIN organization c2 " +
"ON c1.parent_org_id=c2.organization_id " +
"WHERE c2.parent_org_id=?";
return em.createNativeQuery(query, String.class).setParameter(1, orgId).getResultList();
从您的解决方案来看,我强烈建议您学习 SQL 和 JPA。
推荐阅读
- ms-access - 即使输入框已链接,参数输入也会显示
- php - 我为我的域设置了一个全局 cookie,当用户导航到一个页面时,我想检查该 cookie 是否存在;如果没有,那么它会给他们一个 404
- shell - awk:将一个字段拆分为一列中的多行
- java - 我可以在 JTabbedPane 选项卡中使用不同大小的 JPanel 吗?
- python-3.x - 如何将 numpy.ndarray 列表(每个 numpy.ndarray 是一个 1*3 向量)重塑为 2-D Matrix ,以表示为图像?
- process - 操作系统中进程运行状态和执行状态的区别
- hive - Athena 的 .csv.metadata 文件的数据格式是什么?
- stm32 - 在 stm32H7 上运行 YOLOv3-tiny 怎么样?
- ruby - RubyMine 在尝试创建 SDK 时出现通信错误
- javascript - 如何通过 SocketIO 使用 CommonJS 导出和导入?