Критерии к списку Entityinstance + Extrafield - PullRequest
1 голос
/ 28 ноября 2011

я почти уверен, что этот вопрос где-либо уже задавался - не нашел ответа.

У меня есть такие простые критерии:

s.createCriteria(Human.class).list()

дает мне итоговый список сущности человека (пол и имя).

Могу ли я добавить вычисление типа "приветствие" только к полученным экземплярам объекта (без изменения Human.java) и избежать создания двумерного массива?

Я знаю, это должна быть работа такого класса-декоратора, есть ли обходной путь? Увеличенный экземпляр сущности должен расширить человеческий класс!

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Нет, это не совсем возможно.Запрос Criteria может возвращать только сущности, массивы скаляров или объекты-значения, построенные из скаляров (используя ResultTransformer).

Вы можете вернуть список HumanWithSalutation объектов, которые будут содержать те же поля, что и Человек + дополнительное приветствие, но это будут объекты значения, а не постоянные объекты: любые изменения, внесенные в эти объектыне будет сделан постоянным для базы данных, как это было бы с человеческими экземплярами.

Для этого создайте класс:

public class HumanWithSalutation extends Human {
    private String salutation;

    // getter and setter
}

Назначьте ему AliasToBeanResultTransformer (который будет заполнять всеваши HumanWithSalutation объекты, использующие сеттеры), и убедитесь, что у критерия есть список проекций, возвращающий все поля человека + приветствие (псевдоним "приветствие"):

ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id");
projectionList.add(Projections.property("name");
projectionList.add(Projections.property("gender");
projectionList.add(Projections.alias(Projections.sqlProjection(...), "salutation"));
criteria.setProjection(projectionList);

Если вы не хотитеВ проекции SQL вы можете реализовать преобразование в Java в методе getSalutation() (и удалить установщик).

0 голосов
/ 01 ноября 2012

Вы можете добавить свойство с @Formula отображением в класс Human, если вас устраивает @Formula нетерпеливое получение.

Или, если вам нужно, чтобы это свойство лениво выбиралось, создайте дополнительный объект в той же таблице, что и Human class

@Entity
@Table("HUMAN")
@Immutable
public class HumanWithSalutation extends Human {
    @Id
    private Long id;
    @Formula("(select ...)")
    private String salutation;

    // getter and setter
}

, а затем сопоставьте его с Human на @OneToOne(fetch = FetchType.LAZY) с @PrimaryKeyJoinColumn.

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