Инициализация переходного атрибута объекта 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