Как создать пользовательский запрос для CollectionOfElements - PullRequest
2 голосов
/ 18 июня 2010

У меня проблемы с созданием пользовательского запроса.

Вот какие объекты:

@Entity
public class ApplicationProcess {

    @CollectionOfElements
    private Set<Template> defaultTemplates;
    //more fields
}

И Template.java

@Embeddable
@EqualsAndHashCode(exclude={"used"})
public class Template implements Comparable<Template> {

 @Setter private ApplicationProcess applicationProcess;
 @Setter private Boolean used = Boolean.valueOf(false);

 public Template() {
 }

 @Parent
 public ApplicationProcess getApplicationProcess() {
   return applicationProcess;
 }

 @Column(nullable = false)
 @NotNull
 public String getName() {
   return name;
 }

 @Column(nullable = true)
 public Boolean isUsed() {
   return used;
 }

 public int compareTo(Template o) {
   return getName().compareTo(o.getName());
 }
}

Я хочу создать обновлениезаявление.Я пробовал эти два:

int v = entityManager.createQuery("update ApplicationProcess_defaultTemplates t set t.used = true " + "WHERE t.applicationProcess.id=:apId").setParameter("apId", ap.getId())
   .executeUpdate();

ApplicationProcess_defaultTemplates is not mapped [update ApplicationProcess_defaultTemplates t set t.used = true WHERE t.applicationProcess.id=:apId]

И я пробовал

 int v = entityManager.createQuery("update Template t set t.used = true " + "WHERE t.applicationProcess.id=:apId").setParameter("apId", ap.getId())
   .executeUpdate();

С той же ошибкой:

Template is not mapped [update Template t set t.used = true WHERE t.applicationProcess.id=:apId]

Есть идеи?

ОБНОВЛЕНИЕ

Я исправил это, создав собственный запрос

int v = entityManager.createNativeQuery("update ApplicationProcess_defaultTemplates t set t.used=true where t.ApplicationProcess_id=:apId").setParameter("apId", ap.getId()).executeUpdate();

Ответы [ 3 ]

2 голосов
/ 18 июня 2010

То, что вы хотите сделать, невозможно в hql: поскольку встроенные объекты не являются сущностями, они не могут появляться в предложении from запросов hql. И чтобы обновить этот объект, нужно, чтобы он был в предложении from.

Итак, у вас есть две возможности:

  • Либо используйте SQL-запрос (будьте осторожны, чтобы узнать влияние (отсутствие) SQL-обновления на текущие сущности сеанса)
  • рефакторинг вашего класса Template в сущность
0 голосов
/ 18 июня 2010

Embeddables нельзя запросить напрямую (массовые или нет), они не являются независимыми объектами, так как у них нет Id (и установка обратного ссылки на собственный класс не сделает это возможным).1004 *

Либо обновите объект-владелец через EntityManager, либо сделайте ваш Template сущностью.

0 голосов
/ 18 июня 2010

Не думаю, что ты можешь.Hibernate позволяет обновлять только сущности, но не встраиваемые или сопоставленные суперклассы.Чтобы попасть в Template, вам нужно присоединиться, но объединения не разрешены в обновлениях HQL.Вот относительное ограничение из документов HQL :

В массовом запросе HQL нельзя указывать ни явные, ни явные объединения.Подзапросы могут использоваться в предложении where, где сами подзапросы могут содержать объединения.

Вам придется использовать либо собственный SQL, либо извлекать и изменять значения полей в коде Java..

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