Объединение двух объектов на карту с использованием данных Spring - PullRequest
0 голосов
/ 28 января 2020

У меня есть объект:

@Entity
@Table(name = "votes")
public class Vote extends AbstractBaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private LocalDate date = LocalDate.now();

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "restaurant_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Restaurant restaurant;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    public Vote() {
    }

    public Vote(User user, Restaurant restaurant) {
        this.user = user;
        this.restaurant = restaurant;
    }

    //getters and setters
}

Я использую репозиторий Spring Data для работы с объектами, и у меня есть метод, который вычисляет количество голосов для ресторана:

@Repository
public interface VoteRepository extends CrudRepository<Vote, Integer> {

    Integer countByRestaurantId(Integer restaurantId);
}

А теперь я хочу получить статистику голосования от моего контроллера. Например - я могу получить HashMap <LocalDate, Integer>, где Integer - это число голосов за особую дату:

@RestController
@RequestMapping(value = ADMIN_VOTES_URL, produces = JSON_TYPE)
public class AdminVoteController implements Controller {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @Autowired
    private VoteService voteService;

    @GetMapping("/statistics")
    public Map<LocalDate, Integer> getVoteStatistics(@PathVariable Integer restaurantId) {
        log.info("get count of the votes for restaurant {}", restaurantId);
        return voteService.getVoteStatistic(restaurantId);
    }
}

Это был мой неудачный запрос на репозиторий:

@Query("select distinct v.date, count(v.id) from Vote v where v.restaurant.id = ?1 group by v.date")
    Map<LocalDate, Integer> findAllByDateAndRestaurantId(Integer restaurantId);

Как я могу это сделать с помощью Spring Data? Вы также можете предложить мне другой способ сделать это, спасибо!

1 Ответ

0 голосов
/ 29 января 2020

Вот самый простой способ исправить это!

1) Создать DTO:

public class VoteTo implements Serializable {

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;

    private Long count;

    public VoteTo() {
    }

    public LocalDate getDate() {
        return date;
    }

    public void setDate(LocalDate date) {
        this.date = date;
    }

    public Long getCount() {
        return count;
    }

    public void setCount(Long count) {
        this.count = count;
    }

    public VoteTo(LocalDate date, Long count) {
        this.date = date;
        this.count = count;
    }
}

2) В том же хранилище я создал этот метод

@Query("select new ru.topjava.graduation.model.dto.VoteTo(v.date, count(v.id)) from Vote v " +
" where v.restaurant.id = ?1 group by v.date")
List<VoteTo> groupCountByData(Integer restaurantId);

где ru.topjava.graduation.model.dto.VoteTo - полный путь к моему классу DTO (пакет + имя класса)

...