аз съм сигурен, че този въпрос навсякъде вече е бил зададен навсякъде - не намерих отговора.
Получих прости критерии като този:
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
.