Java 错误:从Spring Boot和SQL Server生成的API中获取的列表记录重复

Java 错误:从Spring Boot和SQL Server生成的API中获取的列表记录重复,java,spring,spring-boot,spring-mvc,spring-data-jpa,Java,Spring,Spring Boot,Spring Mvc,Spring Data Jpa,我在SQL Server中创建了一个存储过程,它工作正常,如下所示: exec udf_get_gio_hang_by_id_khach_hang @id_khach_hang='KH00003368' 结果是2条记录,如下所示: exec udf_get_gio_hang_by_id_khach_hang @id_khach_hang='KH00003368' 我的目的是创建一个API来获取上述记录的列表。因此,我通过Spring Boot创建API,如下所示: 首先,我创建了一个模型G

我在SQL Server中创建了一个存储过程,它工作正常,如下所示:

exec udf_get_gio_hang_by_id_khach_hang @id_khach_hang='KH00003368'
结果是2条记录,如下所示:

exec udf_get_gio_hang_by_id_khach_hang @id_khach_hang='KH00003368'

我的目的是创建一个API来获取上述记录的列表。因此,我通过Spring Boot创建API,如下所示: 首先,我创建了一个模型
GioHang.java

@Entity
public class GioHang implements Serializable {
    
    @Id
    private String id_khach_hang;
    
    
    private String id_xe;
    private int so_luong;
    
    //setter,getter

}
@Repository
public interface GioHangRepo extends JpaRepository<GioHang,String> {
@Query(value = "{call udf_get_gio_hang_by_id_khach_hang(:id_khach_hang)}",nativeQuery = true)
    public List<GioHang> get_list_gio_hang_via_id_khach_hang(@Param("id_khach_hang")  String id_khach_hang);
}
@Service
@Transactional
public class GioHangService {
    @Autowired
    private GioHangRepo gioHangRepo;

    public List<GioHang> getGioHangById_khach_hang(String id_khach_hang)
    {
        return this.gioHangRepo.get_list_gio_hang_via_id_khach_hang(id_khach_hang);
    }
}
@RestController
@RequestMapping("/gio_hang")
public class GioHangResource {
    @Autowired
    private GioHangService gioHangService;
    
    @GetMapping("/getGioHangById_khach_hang/{id_khach_hang}")
    public ResponseEntity<List<GioHang>> getGioHangById(@PathVariable("id_khach_hang") String id_khach_hang)
    {
        List<GioHang> gh = this.gioHangService.getGioHangById_khach_hang(id_khach_hang);
        return new ResponseEntity<>(gh,HttpStatus.OK);
    }
}

然后我创建了一个存储库接口
GioHangRepo.java

@Entity
public class GioHang implements Serializable {
    
    @Id
    private String id_khach_hang;
    
    
    private String id_xe;
    private int so_luong;
    
    //setter,getter

}
@Repository
public interface GioHangRepo extends JpaRepository<GioHang,String> {
@Query(value = "{call udf_get_gio_hang_by_id_khach_hang(:id_khach_hang)}",nativeQuery = true)
    public List<GioHang> get_list_gio_hang_via_id_khach_hang(@Param("id_khach_hang")  String id_khach_hang);
}
@Service
@Transactional
public class GioHangService {
    @Autowired
    private GioHangRepo gioHangRepo;

    public List<GioHang> getGioHangById_khach_hang(String id_khach_hang)
    {
        return this.gioHangRepo.get_list_gio_hang_via_id_khach_hang(id_khach_hang);
    }
}
@RestController
@RequestMapping("/gio_hang")
public class GioHangResource {
    @Autowired
    private GioHangService gioHangService;
    
    @GetMapping("/getGioHangById_khach_hang/{id_khach_hang}")
    public ResponseEntity<List<GioHang>> getGioHangById(@PathVariable("id_khach_hang") String id_khach_hang)
    {
        List<GioHang> gh = this.gioHangService.getGioHangById_khach_hang(id_khach_hang);
        return new ResponseEntity<>(gh,HttpStatus.OK);
    }
}

最后,我在
GioHangResource.java

@Entity
public class GioHang implements Serializable {
    
    @Id
    private String id_khach_hang;
    
    
    private String id_xe;
    private int so_luong;
    
    //setter,getter

}
@Repository
public interface GioHangRepo extends JpaRepository<GioHang,String> {
@Query(value = "{call udf_get_gio_hang_by_id_khach_hang(:id_khach_hang)}",nativeQuery = true)
    public List<GioHang> get_list_gio_hang_via_id_khach_hang(@Param("id_khach_hang")  String id_khach_hang);
}
@Service
@Transactional
public class GioHangService {
    @Autowired
    private GioHangRepo gioHangRepo;

    public List<GioHang> getGioHangById_khach_hang(String id_khach_hang)
    {
        return this.gioHangRepo.get_list_gio_hang_via_id_khach_hang(id_khach_hang);
    }
}
@RestController
@RequestMapping("/gio_hang")
public class GioHangResource {
    @Autowired
    private GioHangService gioHangService;
    
    @GetMapping("/getGioHangById_khach_hang/{id_khach_hang}")
    public ResponseEntity<List<GioHang>> getGioHangById(@PathVariable("id_khach_hang") String id_khach_hang)
    {
        List<GioHang> gh = this.gioHangService.getGioHangById_khach_hang(id_khach_hang);
        return new ResponseEntity<>(gh,HttpStatus.OK);
    }
}

@RestController
@请求映射(“/gio_hang”)
公共类资源{
@自动连线
私人GIONHANGSERVICE GIONHANGSERVICE;
@GetMapping(“/getGioHangById\u khach\u hang/{id\u khach\u hang}”)
公共响应getGioHangById(@PathVariable(“id_khach_hang”)字符串id_khach_hang)
{
List gh=this.gioHangService.getGioHangById_khach_hang(id_khach_hang);
返回新的响应状态(gh、HttpStatus.OK);
}
}
我在swagger中测试API,但得到了如下重复记录列表:

exec udf_get_gio_hang_by_id_khach_hang @id_khach_hang='KH00003368'
我不知道为什么列表中的记录都和第一条记录一样


请帮帮我。

我认为问题与您使用
id\u khach\u hang
作为主键有关,主键应该是唯一的,在您的情况下不会发生这种情况。您应该有一个具有唯一值的列,并将其用于@Id属性


另外,在用java编写代码时,请不要使用snake符号,这会使事情变得非常难看和难以理解。

我想这个错误是因为我在SQL Server中为
id\u khach\u hang
id\u xe
设置了primary,但只为其中一个设置了
@id
如果: 解决方案1:为
Id\u khach\u hang
Id\u xe

解决方案2:您可以添加另一个列,如
Id\u record
,然后为其生成主键,并为
Id\u khach\u hang
Id\u xe
生成外键。记住
Id\u record
的make
/Id>是的,这是我想要的。谢谢