【问题标题】:I'm trying to implement group by on a table and want to implement it from repository我正在尝试在表上实现 group by 并希望从存储库中实现它
【发布时间】:2019-06-23 10:38:24
【问题描述】:

我有一个表 tbl_rating,我正在尝试获取此表中现有用户的 avg o=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;
    }

}

如果我能得到关于在 Spring Boot 存储库中编写本机查询的任何帮助,将不胜感激

【问题讨论】:

  • 请也显示Rating
  • 先生,添加了 tbl_rating。
  • 不是表格,我是指java代码
  • 添加了用户和评分
  • 看来你没怎么尝试stackoverflow.com/questions/56721884/…。你试过什么?你得到什么样的错误?

标签: spring-boot spring-data-jpa jpql


【解决方案1】:

您可以从 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();
}

【讨论】:

  • 不错的答案。我与专用对象处于同一轨道,但您也在一张桌子上优化了请求。而且速度也更快:-)
  • @XavierBouclet 谢谢。实际上,一个模型有一个请求,但表的连接是在下面完成的
  • 我用了另一种方式,但无法进行自定义回复,请您看一下吗?
  • ` @Query("SELECT r.user, AVG(r.rating) FROM Rating r group by r.user") List findAllRatings();` 我得到了输出但是不能修改
  • @SubhaBhowmik 你确定你得到了你提到的查询的输出吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2015-02-15
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多