Я не знаю, возможно ли это, но я пытаюсь проецировать данные, запрашиваемые из репозитория 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:
Вы возвращаете два значения, crop.id и count, и сообщаете Spring, что это список CropUsedView. Возможно, вы хотели вернуть только один объект?
@ Cepr0 Я пробовал это, но не работает
@ BrunoM24 в чем ошибка?
@chrylis Мне нужен список DTO, у DTO есть два значения, например, когда я делаю List <Crop> findAll (); это работает
@ Cepr0 - та же ошибка
вы пробовали писать SELECT crop.id as id ...... ?
@ BrunoM24 попробуйте проекция базы интерфейса вместо базового класса. А также добавьте псевдоним к corp.id (crop.id as id) ...
Просто остановитесь на мгновение и подумайте, как именно должно работать отображение. Буквально нарисуйте на бумаге возвращаемые значения SELECT и DTO.
@chrylis Я отредактировал сообщение с изображением того, как данные возвращаются, когда я запускаю на mysql, и это то, как я хочу быть сопоставленным с dto, у меня есть DTO с теми же реквизитами
вам нужен собственный запрос? Это может быть 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)




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