Hibernate JPA SqlResultSetMapping конструкторы вложенных классов

Я новичок в программировании 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)
            }
            ...
        }
    }
)

Я знаю, что это недействительный код, я просто хотел узнать, есть ли аналогичный способ сделать это таким образом.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 396
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что вы сжимаете проблему, @ConstructorResult будет содержать те значения в последовательности, которая является результатом запроса. Я не понимаю, почему вы упомянули два @ConstrutorResult в приведенном выше фрагменте кода. Пожалуйста, разработайте вопрос как следует.

Я хочу вызвать конструктор PropertyClassA и конструктор PropertyClassB внутри конструктора для ClassA в аннотации resultSetMapping, используя значения столбца, возвращаемые запросом. Я определенно пытаюсь сделать проблему более компактной. Конечно, я могу вызвать конструктор для этих двух классов внутри конструктора ClassA, который вызывается аннотацией. Я хотел бы знать, можно ли создать более компактный resultSetMap.

Nilkin 22.12.2020 06:43
Ответ принят как подходящий

Нет, это невозможно. Вам придется создавать вложенные объекты самостоятельно в конструкторе.

Я думаю, что это идеальный вариант использования 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

Жалко, что не поддерживается. Определенно попробую использовать вашу библиотеку, однако не могу использовать какие-либо внешние библиотеки, которые не поддерживаются остальной частью проекта. Обязательно попробую вашу библиотеку для других проектов.

Nilkin 22.12.2020 18:12

Другие вопросы по теме