Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Проблемы с Oracle Toplink Essentials JPA
Постоянная ссылка 02-04-2007 anydoby java

В этой статье я постараюсь изложить глюки и неожиданности, которые я встретил, в первый раз воспользовавшись JPA имплементацией от TopLink.

Первое, что я нашел, это невозможность применить массив параметров к запросу. Например, если вы хотите использовать такой запрос:


select m from Messages m where m.name in (:messageNames)

то у вас ничего не получится :) Придется ручками создать запрос и перечислить в нем все строки, которые хотите включить. Когда я пытался подставить список, либо массив, вываливалась ошибка типа:


java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.ArrayList 
for parameter messageNames with expected type of class java.lang.String 
from query string select m from Messages m where m.name in (:messageNames).

Довольно обидно, особенно если учесть, что в бесплатном Hibernate это есть.

Второй глюк, на который я натолкнулся был связан вот с таким запросом:


select m from Messages m, Users u where m.name = :name

В результате:


Exception Description: Problem compiling the query [select m from Messages m, Users u where m.name = :name
]. 
Not yet implemented: Variable [u] is defined in a range variable declaration, but not used in the rest of the query..

Ну что ж, есть надежда, что это допишут. Просто иногда возникают ситуации, когда запрос нужно не переписать полностью, а лишь дополнить условиями из другой таблицы, тогда логично лишь добавить предикат к where, умная база все равно игнорирует таблицы, не участвующие в запросе. Пока что пришлось обойтись переписыванием всего запроса каждый раз с учетом данных условий.

И вот еще один совсем странный баг:


select m from Messages m, Users u where u.name = :userName 
      and m.name = :messageName

Вроде бы ничего особенного? Не тут-то было. Выдаёт вот такое


Exception [TOPLINK-6015] (Oracle TopLink Essentials - 9.1 (Build b36-rc)): 
oracle.toplink.essentials.exceptions.QueryException
Exception Description: Invalid query key [name] in expression.

Здесь пришлось сильно подумать и покопаться, больше всего убило, что Invalid query key - это сообщение, обычно появляющееся когда в pojo не забит правильно мэппинг на таблицу. Однако здесь повод для ошибки совершенно неожиданный. Проблема в порядке, в котором расположены условия. Если поменять местами параметры, все заработает. Оказывается, первым параметром в where секции должно быть поле из таблицы, которая является результатом выборки. Тупо, но факт.

Добавить комментарий

Следующая статья Проблема с popup окнами в JSF при использовании t:saveState