Spring 如何在JpaRepository中为多对一映射实体编写查询

Spring 如何在JpaRepository中为多对一映射实体编写查询,spring,rest,spring-boot,jpa,spring-data-jpa,Spring,Rest,Spring Boot,Jpa,Spring Data Jpa,我有两个实体,它们使用多对一注释进行映射,但在使用另一个表id为find object编写查询后,我在注释掉该应用程序工作所调用的行和方法时出错,但我希望实现该功能,请帮助我 以下是我的实体类: @实体 @表(name=“合同”) 公共类契约实现了可序列化{ @身份证 @GeneratedValue(策略=GenerationType.AUTO) @列(name=“contracted”) 私人长收缩; @列(name=“开始日期”) 私人日期-圣日耳曼日期; @列(name=“结束日期”) 私

我有两个实体,它们使用多对一注释进行映射,但在使用另一个表id为find object编写查询后,我在注释掉该应用程序工作所调用的行和方法时出错,但我希望实现该功能,请帮助我

以下是我的实体类:

@实体
@表(name=“合同”)
公共类契约实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“contracted”)
私人长收缩;
@列(name=“开始日期”)
私人日期-圣日耳曼日期;
@列(name=“结束日期”)
私人日期结束日期;
@manytone(fetch=FetchType.LAZY,可选=false)
@JoinColumn(name=“hotel\u id”,nullable=false)
@OnDelete(action=OnDeleteAction.CASCADE)
@杰索尼奥雷
私人酒店;
//接球手和接球手
第二实体

@实体
@表(name=“Hotel”)
公务舱酒店{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“hotel\u id”)
私人朗酒店;
@列(name=“hotel\u name”)
私人字符串酒店;
@列(name=“hotel\u location”)
私人字符串酒店_位置;
@列(name=“hotel\u email”)
私人字符串酒店;
@列(name=“酒店电话”)
私人字符串酒店
//接球手和接球手
我的合同服务课

@服务
公共类合同服务{
@自动连线
私人合约储存库;
@自动连线
私人酒店资源库酒店资源库;
公共列表getAllContracts(){
返回contractRepository.findAll();
}
公共列表findByHotelId(长hotelId,可分页){
返回contractRepository.findByHotelId(hotelId,可分页);
}
公共响应删除合同(长酒店、长合同)
{
返回contractRepository.findByIdAndHotelId(contractId,
hotelId).地图(合同->{
contractRepository.delete(合同);
返回ResponseEntity.ok().build();
}).orelsetrow(()->new ResourceNotFoundException(“未找到注释
带有construcd“+construcd+”和hotelId“+hotelId”);
}
我的合同存储库

@存储库
公共接口ContractRepository扩展了JpaRepository{
列出findByHotelId(长hotelId,可分页);
可选findByIdAndHotelId(长id,长hotelId);
}
我在运行项目时遇到此错误

org.springframework.beans.factory.UnsatifiedPendencyException:创建名为“contractController”的bean时出错:通过字段“contractService”表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.UnsatifiedPendencyException:创建名为“contractService”的bean时出错:未满足d通过字段“contractRepository”表示的依赖关系;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“contractRepository”的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:未能为方法公共抽象java.util.List com.su创建查询nTravel.sunRest.repository.ContractRepository.findByHotelId(java.lang.Long,org.springframework.data.domain.Pageable)!未找到类型Hotel的属性id!遍历路径:Contract.Hotel


解决方案可能是:根据堆栈跟踪,Spring数据正在
Hotel
类中查找id变量(主键)。因此,请将
private long Hotel_id;
更改为
private long id;

另一个解决方案(无需更改任何内容,只需添加您自己的查询):

使用
@query
编写您自己的JPA查询

例如:

@Query(“从合同中选择contract.hotel作为合同,其中contract.hotel.hotel\u id=:hotelId”)
列出findByHotelId(长hotelId,可分页);

您应该将主键从hotel_id重命名为id,这样只有您的存储库方法才能工作

@Entity
@Table(name="Hotel")
public class Hotel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="hotel_id")
    private long id;
    @Column(name="hotel_name")
    private String hotel_name;
    @Column(name="hotel_location")
    private String hotel_location;
    @Column(name="hotel_email")
    private String hotel_email;
    @Column(name="hotel_telephone")
    private String hotel_telephone
   // getters and setters