Инициализация временного атрибута объекта JPA во время CriteriaQuery

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

Пример

@Entity
public SampleEntity{

  @Id
  private long id;

  [more attributes]

  @Transient
  private String someTransientString;

  [getters and setters]
}

Теперь я хочу составить CriteriaQuery, который загружает все SampleEntity и автоматически устанавливает someTransientString в imamightlyfinestring. У меня есть что-то вроде следующего SQL:

SELECT ID AS ID, [..], 'imamightilyfinestring' AS SOME_TRANSIENT_STRING FROM SAMPLE_ENTITY 

Я, конечно, знаю, что могу просто повторить полученную коллекцию и вручную установить атрибут, но мне интересно, есть ли способ сделать это в JPA2.

Спасибо :)


person ftr    schedule 25.04.2012    source источник


Ответы (2)


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

Если вы можете определить значение для someTransientString вне запроса, вы можете использовать Обратный вызов PostLoad (выдержка из спецификации JPA 2.0):

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

Просто добавьте следующее к своей сущности:

@PostLoad
protected void initSomeTransientString() {
    //Likely some more complex logic to figure out value,
    //if it is this simple, just set it directly in field declaration.
    someTransientString = "imamightilyfinestring";
}
person Mikko Maunu    schedule 25.04.2012

Вы также можете инициализировать свои переходные процессы в конструкторе по умолчанию (т. е. без аргументов).

Вы можете видеть, что эта стратегия используется, например, в EclipseLink (прочитайте последний комментарий в следующей ссылке):

https://bugs.eclipse.org/bugs/show_bug.cgi?id=292385

person mljrg    schedule 08.05.2015