Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate JPA и Bulk Update - ругается парсер JPQL


Автор: AJetman 29.8.2009, 12:48
В приложении использую Hibernate JPA. Столкнулся со следующей проблемой. Имеем запрос на обновление данных:

Код
 @Transactional
    public int cancelNotPayedOrders(int timeout) {
        final Calendar date = GregorianCalendar.getInstance();
        date.add(Calendar.SECOND, - timeout);

        return (Integer)getJpaTemplate().execute(new JpaCallback() {
            public Object doInJpa(EntityManager em) throws PersistenceException {
                int total = em.createQuery("UPDATE OrderEntity o SET o.status = ?1 WHERE o.status = ?2 AND o.time < ?3")
                        .setParameter(1, OrderEntity.OrderStatus.CANCEL)
                        .setParameter(2, OrderEntity.OrderStatus.PAYMENT)
                        .setParameter(3, date, TemporalType.TIMESTAMP)
                        .executeUpdate();

                return new Integer(total);
            }
        });
    }


Парсер Hibernate ругается на запрос, что присутствует неизвестный токен "ru" и запрос не отрабатывается. Включил дебаг и вижу следующее:
Код
UPDATE ru.xxxxxx.order.OrderEntity o SET o.status = ?1 WHERE o.status = ?2 AND o.time < ?3


С точки зрения JPQL все абсолютно верно, а парсер ругается на название пакета моего Entity. Исходя из того, что в SQL в запросе DELETE еще присутствует FROM, то попытался добавить FROM и для нашего запроса... И все сработало на ура. 

Порылся в коде парсера Hibernate - он видимо написан на ANTLR, т.к. видно что чем-то класс сгенерирован. И действительно, оказалось, что просто UPDATE вывалится в ошибку, а UPDATE FROM отработает на ура....

Это баг в Hibernate или так задумано? Hibernate последний, по крайней мере из официальных репозитариев Maven'a.

Крик души: я новичок в Java, но уже задолбался обходить различные глюки(недоработки) и рыться в Mailing List'aх...

Автор: Akeem 30.8.2009, 17:31
Странно у меня при подобном запросе на MySQL проблем небыло. Update UserEntity работал без From

Автор: AJetman 31.8.2009, 01:49
Цитата(Akeem @ 30.8.2009,  17:31)
Странно у меня при подобном запросе на MySQL проблем небыло. Update UserEntity работал без From

В официальном описании JPQL тоже без From, конечно же. Это я просто обошел этот баг(или все же не баг) таким образом, посмотрев, как работает парсер.

БД PostgreSQL, но это роли не играет.

У меня в Maven подключена всего одна зависимость: hibernate-entitymanager-3.4.0.GA.jar, которая тянет за собой:
hibernate-annotations-3.4.0.GA.jar
hibernate-commons-annotations-3.1.0.GA.jar
hibernate-core-3.3.0.SP1.jar

Дошло, что можно попробовать подсунуть еще более свежий corе, если добавить свою зависимость на него. Попробую - отпишусь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)