当前位置: 首页 > 知识库问答 >
问题:

如何在 JpaRepository 中将多个查询写入一个映射实体

赵渊
2023-03-14

我有两个实体,并使用多对一注释来映射它们,但是在使用另一个表id编写了查找对象的查询后,当我注释掉调用该应用程序的行和方法时,出现了一个错误,但是我想实现该功能,请帮助我

这些是我的实体类:

@Entity
@Table(name = "Contract")
public class  Contract implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "contractId")
    private long contractId;

    @Column(name="start_date")
    private Date st_date;

    @Column(name="end_date")
    private Date end_date;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "hotel_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    private Hotel hotel;

    // getters and setters

第二个实体

@Entity
@Table(name="Hotel")
public class Hotel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="hotel_id")
    private long hotel_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

我的合同服务类

@Service
public class ContractService {
    @Autowired
    private ContractRepository contractRepository;

    @Autowired
    private HotelRepository hotelRepository;

    public List<Contract> getAllContracts(){
        return contractRepository.findAll();
    }

    public List<Contract> findByHotelId(Long hotelId,Pageable pageable){
        return contractRepository.findByHotelId(hotelId, pageable);
    }
    public ResponseEntity<?> deleteContract(Long hotelId, Long contractId)                
    {
    return contractRepository.findByIdAndHotelId(contractId,         
    hotelId).map(Contract -> {
        contractRepository.delete(Contract);
        return ResponseEntity.ok().build();
    }).orElseThrow(() -> new ResourceNotFoundException("Comment not found 
    with ContractId " + contractId + " and hotelId " + hotelId));
}

我的合同存储库

@Repository
public interface ContractRepository extends JpaRepository<Contract, Long> {
    List<Contract> findByHotelId(Long hotelId, Pageable pageable);
    Optional<Contract> findByIdAndHotelId(Long id, Long hotelId);
}

我在运行项目时遇到此错误

org.springframework.beans.factory.未满足的依赖异常:创建名称为“合同控制器”的bean时出错:通过字段“合同服务”表示的依赖项未满足;嵌套异常是org.springframework.beans.factory.未满足的依赖异常:创建名称为“合同服务”的bean时出错:通过字段“合同存储库”表示的依赖项未满足;嵌套异常是org.springframework.beans.factory.BeanCreation异常:创建名称为“合同存储库”的bean时出错:初始化方法调用失败;嵌套异常是java.lang.IllegalArgument异常:未能创建方法公共抽象java.util.列表com.sunTravel.sunRest.repository.ContractRepository.findByHotelId(java.lang.长,org.springframework.data.domain.可分页)的查询!未找到酒店类型的属性ID!遍历路径:Contract.hotel.

共有2个答案

邵祺
2023-03-14

您应该将主键从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
姚正真
2023-03-14

第一个解决方案:基于堆栈跟踪,Spring数据在Hotel类中查找id变量(主键)。所以请更改<code>private long hotel_id到私有长id

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

使用< code>@Query编写自己的JPA查询。

示例:

@Query("SELECT contract from Contract as contract where contract.hotel.hotel_id = :hotelId")
List<Contract> findByHotelId(Long hotelId, Pageable pageable);
 类似资料:
  • 问题内容: 假设我有两个表,并且 我想在一个查询中将来自某些输入的数据插入到表中,该怎么做? 请,如果可以做到,请解释语法。 问题答案: MySQL不支持在单个INSERT语句中进行多表插入。奇怪的是,Oracle是我所知道的唯一一个…

  • 我正在尝试在web.xml中映射多个servlet。在我的index.html中,我有一个操作“desktype.do”的表单,当我运行程序时,它成功了。我是这样开始的: …效果很好。它成功地编译,并且在按下我在index.html中设置的按钮后,它就会按照需要运行。在添加了额外的servlet映射之后: 我收到错误“模块尚未部署。详细信息请参阅服务器日志。构建失败(总时间;0秒)”我不确定该怎么

  • 我总共有10行这样的 PHP 我正在尝试在一个查询中插入数据库中的所有记录?我如何在一个查询中插入数据库中的所有行?

  • 当我映射同一个实体时,就像这里回答的那样: Hibernate与同一实体的多对多关联 在“tbl_friends”表中,我有相同含义的行。例如,我有id=1的用户和id=2的用户。在“tbl_friends”表中,当他们作为朋友链接时,我有两行 使用Hibernate或JPA引用是否可以在一行(1-2或2-1)中建立这种关系?

  • 我正在尝试通过加入来获取记录。我对Spring是个新手。我知道每个实体(表)都有单独的存储库,在实现时需要定义主键的实体和数据类型。 谁能建议我如何通过连接两个表来获取记录。 我有两个回购如下: 我想加入以上两个实体(AEntity,BEntity)。我知道我可以使用以下内容进行自定义查询: 但是,我可以使用连接编写相同类型的查询(连接查询)。我需要有一个单独的存储库来实现其他一些类吗? 谁能帮忙

  • 问题内容: 服务类具有一个接受多个参数的操作。这些参数作为查询参数传递给服务调用。 这些参数的列表正在增长,因此我想将它们放入包含所有这些参数的单个bean中。 你会怎么做?这有可能吗? 问题答案: 您可以使用。 在您的资源中,您只需要使用。 提供者将被自动调用。