2012-02-16 16 views
0

次のクエリを機能させようとしていますが、クエリのcreateSQL部分とStringBuilderセクションに問題があります。どんな助けもありがとう。Hibernate Query 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

+0

ログにエラーメッセージを投稿できますか? – ManuPK

+0

私は私の目の前にアプリを持っていませんが、カウント(c2。*)に関する例外が発生しました。 createSQLQueryに正しい構文が含まれていますか? –

答えて

0

c2。*をc2.idに置き換える必要があります。

select c1.id, count(c2.id) 
関連する問題