Я новичок в программировании Hibernate и Spring, и я пытаюсь лучше понять аннотации и использовать их. Мой вопрос: можете ли вы вложить ConstructorResults. Мое текущее отображение будет похоже на это.
@SqlResultSetMapping(name = "obj",
classes = {
ConstrutorResult(targetClass=ClassA.class, columns{
@ColumnResult(name = "type1key", type=String.class),
@ColumnResult(name = "type1desc", type=String.class),
@ColumnResult(name = "type2key", type=String.class),
@ColumnResult(name = "type2desc", type=String.class),
...
}
}
)
Мне интересно, можете ли вы сопоставить вложенный класс. Итак, мой класс, который я отображаю, содержит классы, которые обрабатывают свои данные отдельно и помечены как @Transient. Итак, возможно ли что-то вроде нижеприведенного?
@SqlResultSetMapping(name = "obj",
classes = {
@ConstrutorResult(targetClass=ClassA.class, columns{
@ConstrutorResult(targetClass=PropertyClassA.class, columns{
@ColumnResult(name = "type1key", type=String.class),
@ColumnResult(name = "type1desc", type=String.class)
},
@ConstrutorResult(targetClass=PropertyClassA.class, columns{
@ColumnResult(name = "type2key", type=String.class),
@ColumnResult(name = "type2desc", type=String.class)
}
...
}
}
)
Я знаю, что это недействительный код, я просто хотел узнать, есть ли аналогичный способ сделать это таким образом.
Я думаю, что вы сжимаете проблему, @ConstructorResult будет содержать те значения в последовательности, которая является результатом запроса. Я не понимаю, почему вы упомянули два @ConstrutorResult в приведенном выше фрагменте кода. Пожалуйста, разработайте вопрос как следует.
Нет, это невозможно. Вам придется создавать вложенные объекты самостоятельно в конструкторе.
Я думаю, что это идеальный вариант использования Blaze-Persistence Entity Views. Поскольку Blaze-Persistence поддерживает расширенные концепции SQL в области модели JPA, вам обычно не нужно писать собственные запросы, и вы можете использовать Entity-Views Blaze-Persistence для сопоставления результатов.
Я создал библиотеку, чтобы упростить сопоставление между моделями JPA и пользовательским интерфейсом или моделями, определенными абстрактными классами, что-то вроде Spring Data Projections на стероидах. Идея состоит в том, что вы определяете свою целевую структуру (модель домена) так, как вам нравится, и сопоставляете атрибуты (геттеры) с помощью выражений JPQL с моделью объекта.
Модель DTO для вашего варианта использования может выглядеть следующим образом с Blaze-Persistence Entity-Views:
@EntityView(EntityClassA.class)
public interface ClassA {
@IdMapping
Long getId();
String getName();
EntityPropertyClassA getProperty1();
EntityPropertyClassA getProperty2();
@EntityView(EntityPropertyClassA.class)
interface PropertyClassA {
@IdMapping
Long getId();
String getName();
}
}
Запрос — это вопрос применения представления сущности к запросу, простейшим из которых является просто запрос по идентификатору.
EntityClassA a = entityViewManager.find(entityManager, EntityClassA.class, id);
Интеграция Spring Data позволяет использовать его почти как Spring Data Projections: https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
Жалко, что не поддерживается. Определенно попробую использовать вашу библиотеку, однако не могу использовать какие-либо внешние библиотеки, которые не поддерживаются остальной частью проекта. Обязательно попробую вашу библиотеку для других проектов.
Я хочу вызвать конструктор PropertyClassA и конструктор PropertyClassB внутри конструктора для ClassA в аннотации resultSetMapping, используя значения столбца, возвращаемые запросом. Я определенно пытаюсь сделать проблему более компактной. Конечно, я могу вызвать конструктор для этих двух классов внутри конструктора ClassA, который вызывается аннотацией. Я хотел бы знать, можно ли создать более компактный resultSetMap.