Hibernate Positional参数不存在:查询中为1

时间:2012-02-17 04:25:47

标签: mysql sql hibernate nhibernate postgresql

我正在尝试执行以下查询,但接收以下异常。

   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.id) "
            + "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());
    }
  

位置参数不存在:查询中的1:选择c1.id,   count(c2.id)从CATEGORY c1左边加入CATEGORY c2   c2.parentCategoryId = c1.id其中c1.id在(?)组中由c1.id

2 个答案:

答案 0 :(得分:5)

位置参数从0开始,因此您可能需要将设置代码更改为此

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

答案 1 :(得分:2)

看起来hibernate希望你设置一个参数,因为问题是一个问号:

where c1.id in (?)

对hibernate不太了解,但我想你可以设置questions实际包含实例questions = '1, 2, 3';的值,以便查询被替换为:

where c1.id in (1, 2, 3)

或许,我认为这将是适当的方式(如果hibernate支持这个!)使用查询:

where c1.id in (?)

从hibernate调用一个替代它的方法?用你在php中设置的参数。这样的事可能吗?

query.setString(0, questions);

希望这有帮助,乔治。