Spring JPA使用findAll方法查出的数据跟数据库里存储的不一样

今天遇到个有意思的问题:findAll查出的数据竟然很数据库里存储的数据不一样

本来数据库里有全国所有省份的数据但是查出来只有河南和浙江的数据条数一样,数据大量重复

经过分析是Entity的ID字段在数据库中并不是唯一的,而且重复的很多,后来改成联合主键就正常了。

选ID的时候一定要确认是否是唯一的,因为JPA底层会根据这个ID判断俩个Entity是不是一样的。

以下是配置联合主键的代码:

/**
 * @Description:
 * @Author: tianlang
 * @Email: tianlangstudio@aliyun.com
 * @Date: 20-5-6 下午6:19
 */
package email.tianlangstudio.aliyun.com.datav.model;

import javax.persistence.*;
import java.math.BigDecimal;

/**
 * 员工地域信息表
 * 包含省、市、员工个数信息
 *
 SELECT gsdm as 单位,
        nd as 年份,
        province as 省,
        city as 市,
        SUM(rgcb) AS 金额,
        SUM(sl) AS 数量  FROM map   GROUP BY gsdm,nd,province,city
 * ***/
@Entity
@Table(name = "map")
@IdClass(EmployeeRegionInfoKey.class)
public class EmployeeRegionInfo {
    /*
    * 公司代码
    * **/
    @Id
    @Column(name = "gsdm")
    private String companyCode;

    /**
     * 年份
     * **/
    @Id
    @Column(name = "nd")
    private Integer year;

    /*
    * 省名称
    * **/
    @Id
    @Column(name = "province")
    private String province;

    /**
     * 市名称
     * **/
    @Id
    @Column(name = "city")
    private String city;
    /**
     * 金额
     * **/
    @Column(name = "rgcb")
    private BigDecimal moneyAmount;

    /**
     * 数量
     * **/

    @Column(name = "sl")
    private Integer employeeAmount;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCompanyCode() {
        return companyCode;
    }

    public void setCompanyCode(String companyCode) {
        this.companyCode = companyCode;
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public BigDecimal getMoneyAmount() {
        return moneyAmount;
    }

    public void setMoneyAmount(BigDecimal moneyAmount) {
        this.moneyAmount = moneyAmount;
    }

    public Integer getEmployeeAmount() {
        return employeeAmount;
    }

    public void setEmployeeAmount(Integer employeeAmount) {
        this.employeeAmount = employeeAmount;
    }
}
/**
 * @Description:
 * @Author: tianlang
 * @Email: tianlangstudio@aliyun.com
 * @Date: 20-5-7 下午1:47
 */
package email.tianlangstudio.aliyun.com.datav.model;

import org.springframework.context.annotation.Primary;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.math.BigDecimal;

//@Embeddable
//@Primary
public class EmployeeRegionInfoKey implements Serializable {
    /*
     * 公司代码
     * **/

    //@Column(name = "gsdm")
    private String companyCode;

    /**
     * 年份
     * **/
    //@Column(name = "nd")
    private Integer year;

    /*
     * 省名称
     * **/
    //@Column(name = "province")
    private String province;

    /**
     * 市名称
     * **/
    //@Column(name = "city")
    private String city;


    public String getCompanyCode() {
        if(companyCode == null) {
            companyCode = "";
        }
        return companyCode;
    }

    public void setCompanyCode(String companyCode) {
        this.companyCode = companyCode;
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    public String getProvince() {
        if(province == null) {
            province = "";
        }
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        if(city == null) {
            city = "";
        }
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }


    @Override
    public boolean equals(Object obj) {
        EmployeeRegionInfoKey other = (EmployeeRegionInfoKey)obj;
        return other.getYear() == this.getYear() &&
                other.getCompanyCode().equals(this.getCompanyCode()) &&
                other.getProvince().equals(this.getProvince()) &&
                other.getCity().equals(this.getCity());

    }

    @Override
    public int hashCode() {
        return (this.getCity() + this.getProvince() + this.getYear() + this.getCompanyCode()).hashCode();
    }
}

 

Spring Boot项目中,如果不想使用Spring Data JPA,你可以选择使用MyBatis等ORM框架配合手动编写Mapper接口来操作数据库。以下是一个基本流程: 1. 配置MyBatis:首先,在Spring Boot项目的pom.xml文件中添加MyBatis依赖。例如: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.6</version> </dependency> ``` 2. 创建Mapper接口:创建一个Mapper接口,例如`UserMapper.java`,用于定义SQL查询方法: ```java public interface UserMapper { List<User> getAllUsers(); User getUserById(int id); } ``` 3. XML映射文件:在resources目录下的mappers包下,为每个Mapper接口创建一个XML映射文件(如`UserMapper.xml`),编写具体的SQL查询语句。 4. 注册Mapper:在Spring配置类中注册Mapper,并开启扫描,使得Spring能够自动扫描到Mapper接口: ```java @Configuration @MapperScan("com.example.mapper") // 替换为你项目的mapper包名 public class MybatisConfig { // 其他配置... } ``` 5. 获取数据并发送给Vue:在Controller层,通过@Autowired注入Mapper对象,然后调用其方法获取数据,将数据封装成JSON格式,最后返回给前端,例如: ```java @RestController public class UserController { @Autowired private UserMapper userMapper; @GetMapping("/users") public ResponseEntity<List<UserDto>> getUsers() { List<User> users = userMapper.getAllUsers(); List<UserDto> userDtos = ...; // 将用户对象转换为UserDto对象 return ResponseEntity.ok(userDtos); } // 同理,处理其他HTTP请求对应的Mapper方法 } ``` 在这个例子中,你需要在前端Vue应用中设置axios或其他http客户端,接收Controller返回的数据并在前端展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个不安分的程序员

祝您财源广进

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值