Я пытаюсь реализовать group by на столе и хочу реализовать это из хранилища - PullRequest
0 голосов
/ 23 июня 2019

У меня есть таблица tbl_rating, я пытаюсь получить среднюю оценку пользователей, которые существуют в этой таблице.Это моя таблица.

CREATE TABLE `tbl_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `contact` varchar(255) NOT NULL,
  `status` enum('active','inactive') NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `contact` (`contact`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1

Это таблица tbl_rating

CREATE TABLE `tbl_rating` (
  `id` bigint(255) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `point` int(1) NOT NULL,
  `status` enum('active','inactive') NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

Это запрос, который я пытаюсь реализовать из хранилища.

SELECT r.user_id, u.name, AVG(r.point) AS average
FROM tbl_rating r LEFT JOIN tbl_user u ON u.id=r.user_id
GROUP BY r.user_id;

это мой контроллер

@RequestMapping(value = "/user/rating/avg/individual", method = RequestMethod.POST)
    public JsonNode getAvgRatingOfIndividual(HttpServletRequest httpServletRequest) throws IOException {

        JSONArray response = new JSONArray();

        List<Rating> ratings = new ArrayList<>();

        try {
            ratings = ratingService.getAvgRatingOfIndividual();

            if (ratings.size() > 0) {

            } else {
                response = new JSONArray();
            }
        } catch (Exception e) {
            return objectMapper.readTree(utility.createResponse(500, KeyWord.ERROR, e.toString()).toString());
        }

        return objectMapper.readTree(response.toString());
    }

ниже приведены сервис и репозиторий, в котором я застрял сервис

public List<Rating> getAvgRatingOfIndividual() {
        return ratingRepository.??
    }

репозиторий

@Repository
public interface RatingRepository extends JpaRepository<Rating, Long> {
}

рейтинг модели

@Entity
@Table(name = "tbl_rating")
public class Rating {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    @Column(name = "point")
    int point;

    @Column(name = "status")
    String status;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public int getPoint() {
        return point;
    }

    public void setPoint(int point) {
        this.point = point;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

}

модель пользователя

@Entity
@Table(name = "tbl_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    long id;

    @Column(name = "name")
    String name;

    @Column(name = "email")
    String email;

    @Column(name = "contact")
    String contact;

    @Column(name = "status")
    String status;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getContact() {
        return contact;
    }

    public void setContact(String contact) {
        this.contact = contact;
    }

}

была бы признательна, если бы я мог получить какую-либо помощь по написанию этого собственного запроса в весеннем загрузочном репозитории

1 Ответ

4 голосов
/ 23 июня 2019

Вы можете использовать из DTO и неявно заполнить его в хранилище.

package com.test.dto;

@Value
public class RatingDTO{
  private Long userId;
  private String name;
  private Double average;
}

И в классе хранилища:

//RatingRepository.java
@Repository
public interface RatingRepository extends JpaRepository<Rating, Long> {
  @Query("SELECT new com.test.dto.RatingDTO(R.user.id, R.user.name, AVG(R.point)) FROM Rating R GROUP BY R.user.id")
  List<RatingDTO> getAveragePoints();
}
...