Можно ли избежать 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();
Другие вопросы по тегам