Hibernate HQL Query: Как правильно использовать ЛЮБУЮ функцию в предложении where? - PullRequest
4 голосов
/ 16 июля 2010

Я пытаюсь понять мою ошибку в HQL-запросе:

public List<Pats> getIds(List<String> patIds) {
    Session session = getSession();
    String hql = "from OurPats where patId = any (:patIds)";
    // String hql = "from OurPats where patId in (:patIds)";
    return session.createQuery(hql).setParameterList("patIds", patIds).list();

}

... закомментированная строка работает правильно, но я хочу, чтобы функциональность не-работающее ЛЮБОЕ сравнение, поскольку patIds.size () может быть больше, чем 2 ^ 15 (вызывая разрыв postgresql).

Судя по http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html, ЛЮБАЯ функция должна работать.В других вопросах форума люди говорят, что не следует использовать функцию элементов, как указано в приведенной выше ссылке (я пробовал с элементами, и я получаю ошибку IDENT).Приведенный выше код создает org.hibernate.hql.ast.QuerySyntaxException: неожиданный токен:: ошибка.

Есть идеи?Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Насколько я знаю, = ANY эквивалентно IN (и я думаю, что оптимизатор превратит их в одни и те же запросы). Из документации PostgreSQL:

9.16.4. ANY / SOME

expression operator ANY (subquery)
expression operator SOME (subquery)

Правая часть указана в скобках подзапрос, который должен возвращать точно один столбец. Левое выражение оценивается и сравнивается с каждой строкой результата подзапроса с использованием заданного operator, который должен давать логическое значение результат. Результат ANY равен "true" если какой-либо истинный результат получен. результат «ложь», если нет истинного результата найдено (включая особый случай где подзапрос не возвращает строк).

SOME является синонимом ANY. IN эквивалентно = ANY.

Так что я не думаю, что использование = ANY все равно решит вашу проблему.

Конечно, у меня нет контекста, но вы уверены, что выполнение более 2 ^ 15 OR сравнений действительно имеет смысл?

0 голосов
/ 16 июля 2010

Не уверен, что вы подразумеваете под желанием функциональности «любой», а не «в». Каждая знакомая мне СУБД рассматривает их как синонимы.

= ЛЮБОЙ не разрешен для списков в MySQL, только для подзапросов. Якобы у вас установлен диалект MySQL, и Hibernate знает это?

http://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html

IN и = ANY не являются синонимами, когда используется со списком выражений. IN может взять список выражений, но = ЛЮБОЙ не могу. См. Раздел 11.3.2, «Функции сравнения и операторы».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...