Можно ли избежать typecast на кастомном @Query?
Представьте, что у нас есть сущность:
@Entity
public class Person implements Serializable {
@Id
private String name;
private Long age;
private Boolean isMad;
...
}
И хранилище с тривиальным (и ненужным) примером для пользовательского запроса:
@Repository
public interface PersonRepository extends PagingAndSortingRepository<Info, String> {
@Query("select p.isMad, count(*) from Person p group by p.isMad")
List<Object> aggregateByMadness();
}
Теперь для разбора этого списка нам нужно сделать что-то вроде этого:
for (Object element : list) {
Object[] result = (Object[]) element;
Boolean isMad = (Boolean) result[0];
Long count = (Long) result[1];
}
какая боль, можем ли мы привести результат запроса непосредственно к списку POJO?
1 ответ
Решение
Да, вы можете использовать конструкционное выражение JPQL:
package com.foo;
public class Madness {
public Madness(boolean isMad, Number count) { /* ...*/ }
}
И в вашем хранилище:
@Query("select new com.foo.Madness(p.isMad, count(*)) from Person p group by p.isMad")
List<Madness> aggregateByMadness();