Ошибка Toplink. Пустой результат для действительного sql с непустым результатом - PullRequest
2 голосов
/ 15 апреля 2011

Как это возможно?

Мы выполняем EJBQL для Toplink (БД - Oracle), а query.getResultList пусто.

Но! Когда я переключил уровень журнала на FINE и получил запрос Sql, который генерирует TopLink, я попытался выполнить этот запрос к базе данных и (чудо!) Я получил непустой результат!

В чем может быть причина и как это лечится? Заранее спасибо!

P.S. Без исключений.

UPDATE:

Журнал запросов:

SELECT DISTINCT t0.ID, t0.REG_NUM, t0.REG_DATE, t0.OBJ_NAME, t1.CAD_NUM, t1.CAD_NUM_EGRO, t2.ID, t2.DICT_TYPE, t2.ARCHIVE_DATE, t2.IS_DEFAULT, t2.IS_ACTUAL, t2.NAME, t0.INVENTORY_NUM FROM CODE_NAME_TREE_DICTIONARY t3, DEFAULTABLE_DICTIONARY t2, IMMOVABLE_PROP t1, ABSTRACT_PROPERTY t0 WHERE ((t3.ID IN (SELECT DISTINCT t4.ID FROM CODE_NAME_TREE_DICTIONARY t5, CODE_NAME_TREE_DICTIONARY t4, type_property_parents t6 WHERE (((t5.ID = ?) AND (t4.DICT_TYPE = ?)) AND ((t6.type_property_id = t4.ID) AND (t5.ID = t6.parent_id)))) AND ((t1.ID = t0.ID) AND (t0.PROP_TYPE_DISCR = ?))) AND ((t3.ID = t0.PROP_TYPE) AND ((t2.ID (+) = t1.STATUS_ID) AND (t2.DICT_TYPE = ?)))) ORDER BY t0.REG_NUM ASC
    bind => [4537, R, R, realty_status]|#]

Этот запрос возвращает 100 тыс. Строк, но toplink считает, что это не ...

Ответы [ 6 ]

1 голос
/ 24 апреля 2011

При переформатировании запроса показались странными следующие условия:

AND t2.ID (+) = t1.STATUS_ID
AND t2.DICT_TYPE = ?

(+) указывает на внешнее соединение t2 (DEFAULTABLE_DICTIONARY), но эта таблица представляется необязательной, поскольку для второго условия она должна иметь ненулевой DICT_TYPE.

При ближайшем рассмотрении параметры привязки также кажутся отключенными, поля в порядке

  • CODE_NAME_TREE_DICTIONARY.ID
  • CODE_NAME_TREE_DICTIONARY.DICT_TYPE
  • ABSTRACT_PROPERTY.PROP_TYPE_DISCR
  • DEFAULTABLE_DICTIONARY.DICT_TYPE

При заданных параметрах (4537, R, R, realty_status) первым DICT_TYPE будет 'R', а вторым является строка "realty_status", которая кажется несовместимой.

1 голос
/ 19 апреля 2011

VPD (http://download.oracle.com/docs/cd/B28359_01/network.111/b28531/vpd.htm)? Policies? Определено ли что-то подобное в схеме? Эти функции прозрачно добавляют динамические предложения where в оператор, который выполняется в сеансе базы данных, поэтому результаты запроса зависят от состояния сеанса вэто дело.

1 голос
/ 15 апреля 2011

На уровне журнала FINE вы можете проверить, что вы подключаетесь к той же базе данных? Насколько прост ваш тестовый пример; Можете ли вы проверить, что именно этот JPQL переводится на этот SQL?

0 голосов
/ 26 апреля 2011

Я нашел причину! Причина в Oracle! Я попробовал тот же код на Postgres, и он работал!

Я не знаю почему, но в некоторых волшебных случаях oracle игнорирует параметры запроса и запрос возвращает пустой результат.

0 голосов
/ 21 апреля 2011

Я не могу точно сказать, но я немного удивлен, что строковые параметры не заключены в кавычки. Возможно ли, что в интерактивном режиме есть некоторые автоматические преобразования, но через это соединение вместо строки 'R' оно было преобразовано в INT ascii для R?

0 голосов
/ 15 апреля 2011

Сделки? Oracle никогда не дает вам «грязного чтения», какая база данных говорит о доступе к незафиксированным данным. Если вы отправляете данные по одному соединению, вы не можете получить доступ к ним по любому другому соединению, пока оно не будет зафиксировано. Если вы попытаетесь выполнить запрос позже вручную, данные будут зафиксированы, и вы получите ожидаемый результат.

Эта ситуация может возникнуть, если вы обновляете данные более чем в одном соединении, и манипулирование данными не установлено на «автоматическую фиксацию». По умолчанию JPA выполняет автоматическую фиксацию, но очистка границ транзакции может дать вам более четкий дизайн.

...