столбцы преобразователя собственных запросов hibernate в сложное свойство в dto

У меня есть собственный запрос, и я хочу преобразовать столбцы (b_id, b_code, b_desc) в complexProperty (настраиваемый объект) в ResultDto.

SQL

select a.id   as id,
       a.name as name,
       b.id   as b_id,
       b.code as b_code,
       b.desc as b_desc
  from a
  left join b
    on a.id = b.a_id;

ResultDto.class

public class ResultDto {

    private String id;

    private String name;

    private ComplexPropertyDto complexProperty;

    // other fields and getter|setter

}

ComplexPropertyDto.class

public class ComplexPropertyDto {

    private String id;

    private String code;

    private String desc;

    // other fields and getter|setter

}

Я пытаюсь использовать псевдоним столбца, например complexProperty.code, и трансформатор addScalar("complexProperty.code", StringType.INSTANCE). Но я получил org.hibernate.PropertyNotFoundException: Could not resolve PropertyAccess for complexProperty.code on class xxx.ResultDto.

Обновить

Как преобразовать столбцы в таблице b в свойство complexProperty в ResultDto.class (работать как аннотация Embedded).


person 西门吹雪    schedule 17.12.2020    source источник
comment
Вы не можете использовать addScalar таким образом. Вы можете создать конструктор для ResultDto, а затем сопоставить результаты с помощью аннотации @SqlResultSetMapping. См., Например, это   -  person SternK    schedule 17.12.2020
comment
Я прочитал ваш пример, но мой sql динамический. Так у вас есть другие варианты?   -  person 西门吹雪    schedule 17.12.2020
comment
Возможно, вы можете попробовать использовать ResultTransformer, как он объяснил здесь. Какая именно часть вашего запроса может быть изменена динамически? Одинаков ли результат для всех возможных комбинаций?   -  person SternK    schedule 17.12.2020
comment
Другие поля относятся к динамическим столбцам (например, размер, цвет ...). Я попробовал setResultTransformer( Transformers.aliasToBean( ResultDto.class ) ), а получил org.hibernate.PropertyNotFoundException из-за addScalar(xxx).   -  person 西门吹雪    schedule 18.12.2020
comment
Я прочитал исходный код AliasToBeanResultTransformer и написал собственную реализацию на основе его метода.   -  person 西门吹雪    schedule 21.12.2020


Ответы (2)


Я не знаю, как вы можете заставить ваш конкретный пример работать, но я думаю, что это идеальный вариант использования для Blaze-Persistence Entity Views. Blaze-Persistence Core - это основа, которая добавляет поддержку многих расширенных концепций SQL в области модели JPA.

Я создал библиотеку, чтобы обеспечить простое сопоставление между моделями JPA и пользовательским интерфейсом или моделями, определяемыми абстрактным классом, что-то вроде Spring Data Projection на стероидах. Идея состоит в том, что вы определяете свою целевую структуру (модель предметной области) так, как вам нравится, и сопоставляете атрибуты (геттеры) через выражения JPQL с моделью сущности.

Модель DTO для вашего варианта использования может выглядеть следующим образом с Blaze-Persistence Entity-Views:

@EntityView(TableAEntity.class)
public interface ResultDto {
    @IdMapping
    Long getId();
    String getName();
    ComplexPropertyDto getComplexProperty();

    @EntityView(TableBEntity.class)
    interface ComplexPropertyDto {
        @IdMapping
        Long getId();
        String getCode();
        String getDesc();
    }
}

Запросы - это применение представления сущности к запросу, простейшим из которых является запрос по идентификатору.

ResultDto a = entityViewManager.find(entityManager, ResultDto.class, id);

Интеграция Spring Data позволяет использовать ее почти как Spring Data Projection: https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

person Christian Beikov    schedule 21.12.2020
comment
Что мне делать, если *Dto.class не имеет поля id (или аналогичного поля)? - person 西门吹雪; 23.12.2020
comment
Вы просто удалите это. Поле id вам не требуется, но если оно у вас есть, хорошо сопоставить его, чтобы иметь возможность использовать все стратегии выборки. Однако при использовании неподдерживаемой конфигурации вы получите ошибки при запуске, так что вы мало что можете сделать неправильно. - person Christian Beikov; 23.12.2020

Может, это кому-то поможет. В моем случае не удалось разрешить PropertyAcces, потому что для набора без get.

person Kanaris007    schedule 21.06.2021