Spring JPA Projection - Запрошенные данные из репозитория jpa

Я не знаю, возможно ли это, но я пытаюсь проецировать данные, запрашиваемые из репозитория JPA, в DTO.

У меня такой запрос:

@Query(value =
        "SELECT crop.id, count(*) as total " +
        "FROM xxx.crop_sub_plot " +
        "join crop on crop.id = crop_sub_plot.crop_id " +
        "join sub_plot on sub_plot.id = crop_sub_plot.sub_plot_id " +
        "where sub_plot.enabled = true " +
        "group by crop_id " +
        "order by total DESC;", nativeQuery = true)
List<CropUsedView> findCropsInUseOrderByDesc();

и DTO:

public class CropUsedView implements Serializable{

private BigInteger id;
private BigInteger total;

public CropUsedView() {
}

public CropUsedView(BigInteger id, BigInteger total) {
    this.id = id;
    this.total = total;
}

//getters && setters

Я получаю сообщение об ошибке:

No converter found capable of converting from type [java.math.BigInteger] to type [net.xxx.crop.CropUsedView]

Я действительно не знаю, возможно ли это, есть предложения?

Обновлено: вот как данные возвращаются, когда я запускаю запрос на MySql, и вот как я хочу преобразоваться в DTO:

Spring JPA Projection - Запрошенные данные из репозитория jpa

Попробуйте использовать Long вместо BigInteger

Cepr0 08.06.2018 16:02

Вы возвращаете два значения, crop.id и count, и сообщаете Spring, что это список CropUsedView. Возможно, вы хотели вернуть только один объект?

chrylis -cautiouslyoptimistic- 08.06.2018 16:02

@ Cepr0 Я пробовал это, но не работает

BrunoM24 08.06.2018 16:06

@ BrunoM24 в чем ошибка?

Cepr0 08.06.2018 16:07

@chrylis Мне нужен список DTO, у DTO есть два значения, например, когда я делаю List <Crop> findAll (); это работает

BrunoM24 08.06.2018 16:07

@ Cepr0 - та же ошибка

BrunoM24 08.06.2018 16:07

вы пробовали писать SELECT crop.id as id ...... ?

Angelo Immediata 08.06.2018 16:09

@ BrunoM24 попробуйте проекция базы интерфейса вместо базового класса. А также добавьте псевдоним к corp.id (crop.id as id) ...

Cepr0 08.06.2018 16:11

Просто остановитесь на мгновение и подумайте, как именно должно работать отображение. Буквально нарисуйте на бумаге возвращаемые значения SELECT и DTO.

chrylis -cautiouslyoptimistic- 08.06.2018 16:12

@chrylis Я отредактировал сообщение с изображением того, как данные возвращаются, когда я запускаю на mysql, и это то, как я хочу быть сопоставленным с dto, у меня есть DTO с теми же реквизитами

BrunoM24 08.06.2018 16:18

вам нужен собственный запрос? Это может быть jpql? тогда вы могли бы написать что-нибудь вроде @Query(select new com.example.CropUsedView(c.id, total) from Crop c, count(c.id) total inner join c.subplot s where s.enabled = true group by c)

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

Ответы 1

Ваш запрос возвращает два значения: идентификатор и счетчик (оба могут отображаться в long или BigDecimal). Но Hibernate, поскольку он не отображается напрямую в объект, просто возвращает BigDecimal[].

Чтобы решить эту проблему, вы должны использовать настраиваемый сопоставитель: UserType (https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/usertype/UserType.html). Это позволяет отображать любой ответ в объект с помощью ручного синтаксического анализа.

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