2012-02-16 135 views
0

我想获得以下查询功能,但我遇到了查询的createSQL部分以及StringBuilder部分的困难。任何帮助将不胜感激。休眠查询createSQLQuery

protected List<CategoryNode> findByCriterion(Criterion criterion) { 
     List<Category> cats = session.createCriteria(Category.class).add(criterion).list(); 
     Map<Integer, CategoryNode> childNodes = new LinkedHashMap<Integer, CategoryNode>(); 
     for (Category cat : cats) { 
      CategoryNode childNode = new CategoryNode(); 
      childNode.setCategory(cat); 
      childNodes.put(cat.getId(), childNode); 
     } 
     StringBuilder questions = new StringBuilder(); 
     for (int i = 0; i < childNodes.size(); ++i) { 
      if (i != 0) { 
       questions.append(", "); 
      } 
      questions.append("?"); 
     } 


    Query query = session.createSQLQuery(
      "select c1.id, count(c2.*) " 
      + "from Category c1 " 
      + "left join Category c2 on c2.parentCategoryId = c1.id " 
      + "where c1.id in (" + questions + ") " 
      + "group by c1.id"); 

    int i = 0; 

    for (Iterator<CategoryNode> it = 
     childNodes.values().iterator(); i < childNodes.size(); ++i) { 
     query.setLong(i + 1, 
     it.next().getCategory().getId()); 
    } 

    for (Iterator<Object[]> it = query.iterate(); it.hasNext();) { 
     Object[] result = it.next(); 
     Integer childId = (Integer) result[0]; 
     Integer grandChildCount = (Integer) result[1]; 
     CategoryNode childNode = childNodes.get(childId); 
     childNode.setHasChildren(grandChildCount != 0); 
     childNode.setIsLeaf(grandChildCount == 0); 
    } 

    return new ArrayList<CategoryNode>(childNodes.values()); 
} 
+0

您可以发布您的输出吗? – subodh 2012-02-16 14:24:13

+0

可以在日志中发布错误消息吗? – ManuPK 2012-02-16 15:12:34

+0

我没有在我面前的应用程序,但我得到一个与count(c2。*)相关的异常,说它不喜欢。 createSQLQuery是否包含正确的语法? – 2012-02-16 20:13:02

回答

0

解决需要用c2.id替换c2。*。

select c1.id, count(c2.id)