JPA обновляет несколько строк и таблиц - PullRequest
3 голосов
/ 08 ноября 2011

Мне нужно обновить несколько строк в Таблице a, и, кажется, нормально использовать объектно-ориентированный подход с помощью цикла for и выполнения слияния.

...
// get list and assign columns to be updated
...
for (MyEntity e : entityList) {
   em.merge(e);
}
..

этот подход также позволяет мне обновлять другие таблицы (как другое свойство pf MyEntity).на одном из вопросов, опубликованных здесь обновление нескольких строк с использованием JPA , второй вариант, который использует namedQuery для обновления, кажется более быстрым.Тем не менее, как будет реализовано обновление, если мне также потребуется пакетное обновление нескольких таблиц?

Я попытался:

@NamedQuery(name="Agent.updateAccountStatusByTree",
        query="UPDATE com.sample.core.data.Agent a "
            + "INNER JOIN com.sample.core.data.Player p "
            + "ON a.player.id = p.id "
            + "SET a.accountStatus=:accountStatus, p.status=:accountStatus "
            + "WHERE a.site.id=:siteId and a.agentTree like :agentTree")})

, однако это выдает:

org.hibernate.hql.ast.QuerySyntaxException: expecting "set", found 'INNER'

другой вариант, который я попробовал:

 @NamedQuery(name="Agent.updateAccountStatusByTree",
        query="update com.sample.core.data.Agent a "
            + "set a.accountStatus=:accountStatus, a.player.status=:playerStatus "
            + "where a.site.id=:siteId and a.agentTree like :agentTree")})

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

У меня такое чувство, что ты пытаешься конкурировать не так.Именованный запрос должен быть запросом JPQL (HQL), но похоже, что вы пытаетесь выполнить запрос SQL.

Итак, если вы хотите использовать нативные запросы, то вместо них следует использовать @NamedNativeQuery.Если нет, то вам нужно перевести запрос в JPQL (HQL)

*. Разница между JPQL и HQL приведена в комментариях.

Кстати, JPQL основан на языке запросов Hibernate (HQL).), более ранний нестандартный язык запросов, включенный в библиотеку объектно-реляционного отображения Hibernate.

Hibernate и HQL были созданы до спецификации JPA.Начиная с Hibernate 3, JPQL является подмножеством HQL.(Wikipedia) *

1 голос
/ 08 ноября 2011

JPA специфицирует состояния

update_clause ::= UPDATE entity_name [[AS] identification_variable]
SET update_item {, update_item}*
update_item ::= [identification_variable]{state_field | single_valued_object_field

, поэтому вы не можете присоединиться к оператору UPDATE. Единственный способ обновления с помощью JOIN - это SQL, и тогда вы потеряете независимость хранилища данных, поскольку не все СУБД поддерживают JOIN там одинаково

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