Пользовательские запросы Spring Boot группируются по количеству - PullRequest
0 голосов
/ 06 апреля 2020

У меня проблема с доступом к данным из пользовательского запроса.

Вот это POJO:

@Getter
@Setter
@NoArgsContructor
@AllArgsConstructor
@Entity
@Table(name = "run_list")    
public class RunList {
    @Id
    @Column(name = "id")
    private Long id;

    @Column(name = "control_run_name"
    private String serverName;

    @Column(name = "control_run_date"
    private Date controlRunDate

<.. bunch of other fields .. >

Вот хранилище:

public interface RunListRepository extends JpaRepository<RunList, Long> {

    @Query("SELECT u.serverName,count(u) as controlRunCount from RunList u where u.controlRunDate < :lastUploadDate group by u.serverName")
    List<RunList> findAllControlRunAfterDate(@Param("lastUploadDate") Date lastUploadDate);

В контроллере я вызываю метод репозитория следующим образом:

Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2020-03-01");
model.addAttribute("runList",runListRepository.findAllControlRunAfterDate(date);

Привязка к дате в запросе работает нормально, я получаю первый результат группы, так что это решается. Дело в том, что я получаю сообщение об ошибке при выполнении этого:

Failed to convert from type[java.lang.Object[]] to type [@org.springframework.data.jpa.Query my.package.name.RunList} for value '{server1,14}';

Когда я использую запрос SQL к базе данных из ее CLI, я получаю хорошую группу serverName и счетчика. Я предполагаю, что проблема в преобразовании поля count, которое появляется из ниоткуда из метода репозитория, и Spring не знает, что связать это тоже.

Я пытался использовать RunListDTO здесь только String serverName и Ingeter controlRunCount без удачи - интерфейсу хранилища не понравился я, использующий DTO при выводе метода, используемого в интерфейсе, созданном с помощью.

Есть ли способ сделать этот пользовательский массив / объект в полете, когда хранилище считает?

С уважением, Ярек.

1 Ответ

1 голос
/ 06 апреля 2020

Поскольку вы выбираете поле и счетчик, его никак нельзя сопоставить с вашей сущностью, поэтому этот запрос возвращает массив значений, которые вы указали, как вы можете видеть в исключении: ' {server1, 14} '.

public interface RunListRepository extends JpaRepository<RunList, Long> {

    @Query("SELECT u.serverName,count(u) as controlRunCount from RunList u where u.controlRunDate < :lastUploadDate group by u.serverName")
    List<Object[]> findAllControlRunAfterDate(@Param("lastUploadDate") Date lastUploadDate);

Так что в вашем сервисе вы можете работать с такими данными, как:

List<Object[]> list = runListRepository.findAllControlRunAfterDate(yourDate);
for (Object[] ob : list){
    String serverName = (String)ob[0];
    Integer count = (Integer)ob[1];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...