Hibernate Query createSQLQuery

时间:2012-02-16 13:51:49

标签: hibernate

我正在尝试使用以下查询来运行,但是我遇到了查询的createSQL部分以及StringBuilder部分的困难。任何帮助将不胜感激。

 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());
}

1 个答案:

答案 0 :(得分:0)

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

select c1.id, count(c2.id)
相关问题