JPA Native Query удалить в - PullRequest
       23

JPA Native Query удалить в

4 голосов
/ 18 мая 2010

Я пытаюсь удалить список строк из таблицы, используя этот собственный запрос:

@NamedNativeQuery(name="WebGroup.DeleteIn",
query="DELETE FROM WebGroup WHERE
WebGroup.GROUP_ID IN (:IDsList)"

getEm().createNamedQuery("WebGroup.DeleteIn")
              .setParameter("IDsList", groupToDeleteIDs)
              .executeUpdate();

и это SQL, который выполняет MySQL:

DELETE FROM WebGroup WHERE WebGroup.GROUP_ID IN (:IDsList)

ТАК, JPA не заменяет переменную IDsList ...

Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

4 голосов
/ 17 января 2013

Собственные запросы не поддерживают расширение коллекции и именованные параметры.

вы должны написать:

@NamedNativeQuery(name="WebGroup.DeleteIn", query="DELETE FROM WebGroup WHERE WebGroup.GROUP_ID IN (?,?,?,?)"

Query query = getEm().createNamedQuery("WebGroup.DeleteIn");
for(int i = 0; i < 4; i++) query.setParameter(i + 1, groupToDeleteIDs.get(i));
query.executeUpdate();

но это ужасно

на eclipselink + mysql это работает:

@NamedNativeQuery(name="WebGroup.DeleteIn", query="DELETE FROM WebGroup WHERE WebGroup.GROUP_ID IN (?)"

Query query = getEm().createNamedQuery("WebGroup.DeleteIn");
query.setParameter(1, StringUtils.join(groupToDeleteIDs, ",");
query.executeUpdate();

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

3 голосов
/ 11 января 2011

Один способ, который работает, - это если вы не используете значение идентификатора, как вы пытались, а вместо этого используете сущность и позволяете JPA обрабатывать его идентификацию следующим образом:

HashSet<Transaction> transactions = new HashSet<Transaction>();
... 
entityManager.createQuery(
  "DELETE FROM Transaction e WHERE e IN (:transactions)").
  setParameter("transactions", new ArrayList<Transaction>(
  transactions)).executeUpdate();

Надеюсь, это поможет вам в правильном направлении.

...