首页 > 解决方案 > 如何提高迭代循环的性能

问题描述

我有一个 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 查询更好地实现这一点,请注意我。顺便说一句,我的春季版本不支持流!

标签: javaspringoracle

解决方案


您基本上有一个 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。


推荐阅读