/ / Критерии за списък на Entityin substance + Extrafield - хибернация, критерии, критерии за хибернация

Критерии към списък на Entityinstance + Extrafield - хибернация, критерии, хибернация критерии

аз съм сигурен, че този въпрос навсякъде вече е бил зададен навсякъде - не намерих отговора.

Получих прости критерии като този:

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

ми дава резултат от съществено вещество на човека (пол и име).

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

Знам, това трябва да е работата на такъв клас Декоратор, има ли решение? Увеличеното образувание трябва да разшири човешкия клас!

Отговори:

2 за отговор № 1

Не, това не е напълно възможно. Въпросът за критериите може да върне само обекти, масиви скалари или стойностни обекти, изградени от скалари (използвайки ResultTransformer).

Можете да върнете списък на HumanWithSalutation обекти, които биха държали същите полета като aHuman + допълнително поздравяване, но това биха били стойностни обекти, а не постоянни обекти: всяка промяна, направена на тези обекти, няма да бъде направена устойчива в базата данни, както би станало с човешки инстанции.

За целта създайте класа:

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 за отговор № 2

Можете да добавите свойство с @Formula картографиране в Human клас, ако сте доволни от @Formula нетърпеливо донасяне.

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

@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.