Hibernate Positional параметр не существует: 1 в запросе

Я пытаюсь выполнить следующий запрос, но получаю исключение ниже.

   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 left join CATEGORY c2 on c2.parentCategoryId = c1.id, где c1.id в (?) группе по c1.id


person Code Junkie    schedule 17.02.2012    source источник
comment
Можете ли вы также опубликовать следующую строку кода? Является ли переменная questions строкой с разделителями-запятыми?   -  person Rippo    schedule 17.02.2012
comment
Привет, ребята, спасибо, да вопросы - это строка с разделителями-запятыми. Я разместил весь запрос выше. Любая помощь в этом будет принята с благодарностью.   -  person Code Junkie    schedule 17.02.2012


Ответы (2)


Позиционный параметр начинается с 0, поэтому вам, возможно, придется изменить код настройки на этот.

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

Похоже, что hibernate ожидает, что вы установите параметр, потому что вопросы - это вопросительный знак:

where c1.id in (?)

Не много знаю о спящем режиме, но я думаю, вы могли бы установить questions так, чтобы он фактически содержал значение, например questions = '1, 2, 3';, чтобы запрос был заменен следующим:

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

Или, может быть, что, я думаю, было бы подходящим способом (и если спящий режим поддерживает это!) Используйте запрос:

where c1.id in (?)

И вызвать метод из спящего режима, который заменит это? с параметром, который вы установили для него в php. Что-то вроде этого, может быть?

query.setString(0, questions);

Надеюсь, это поможет, Джордж.

person Mosty Mostacho    schedule 17.02.2012
comment
Привет Мостачо, я использую ваше второе предложение. Я добавлю оставшуюся часть запроса в свой пост. см. выше. - person Code Junkie; 17.02.2012