Инициализация переходного атрибута объекта 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.
Спасибо:)
Ответы
Ответ 1
Нет, вы не можете сделать это в запросе.
Если вы можете определить значение для 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";
}
Ответ 2
Вы также можете инициализировать свои переходные процессы в конструкторе по умолчанию (т.е. без аргумента).
Вы можете видеть, что это стратегия, используемая, например, в EclipseLink (прочитайте последний комментарий в следующей ссылке):
https://bugs.eclipse.org/bugs/show_bug.cgi?id=292385