Вы можете использовать @SqlResultSetMapping
для преобразования каждой записи в вашем наборе результатов в объект DTO .Но для этого потребуется дополнительный конструктор, чтобы вам не нужно было устанавливать какие-либо параметры на null
.
. Вот пример такого отображения.Как видите, вам нужно ссылаться на элементы в вашем наборе результатов по их имени, но вы не поделились своим запросом.Поэтому я не могу адаптировать пример к вашему запросу.
@SqlResultSetMapping(
name = "BookValueMapping",
classes = @ConstructorResult(
targetClass = BookValue.class,
columns = {
@ColumnResult(name = "id", type = Long.class),
@ColumnResult(name = "title"),
@ColumnResult(name = "version", type = Long.class),
@ColumnResult(name = "authorName")}))
Я использую это сопоставление с запросом, который выбирает столбцы id
, title
, version
и authorName
избаза данных.Аннотация @ConstructorResult
описывает вызов конструктора класса BookValue
.Аннотации @ColumnResult
определяют параметры конструктора и их порядок.Необходимо убедиться, что созданный экземпляр класса предоставляет конструктор, который соответствует этим параметрам.
@SqlResultSetMapping
- мощная и гибкая функция в JPA.Я объясню это очень подробно здесь: https://thoughts -on-java.org / result-set-mapping-constructor-result-mappings /
ОК, теперь давайте возьмемвзгляните на проблему приведения класса ...
Приведение не удалось, потому что два объекта имеют неправильный класс.row[4]
кажется byte[]
, а один из row[6/7/8]
(или все они) представляется BigInteger.
Этот фрагмент кода должен помочь вам преобразовать байт [] в UUID:
ByteBuffer bb = ByteBuffer.wrap(bytes);
long high = bb.getLong();
long low = bb.getLong();
UUID uuid = new UUID(high, low);
Преобразование BigDecimal
в Integer
намного проще.Вам просто нужно вызвать метод intValueExact()
на вашем BigDecimal
, например, row[6].intValueExact();
.