Java 休眠错误:非法尝试执行遵从性收集

Java 休眠错误:非法尝试执行遵从性收集,java,hibernate,spring-boot,Java,Hibernate,Spring Boot,你好,我在预订和房间之间有一对多的关系,而且是单向的。预订可能有一到几个房间。现在,我正试图根据特定的日期和房间类型来搜索房间是否可用,例如国王或王后。 我的解决方案: 根据日期条件查找预订表中不存在的房间 房间型号: @Entity @Table(name="room") public class Room implements java.io.Serializable { private static final long serialVersionUID = 10L;

你好,我在预订和房间之间有一对多的关系,而且是单向的。预订可能有一到几个房间。现在,我正试图根据特定的日期和房间类型来搜索房间是否可用,例如国王或王后。 我的解决方案: 根据日期条件查找预订表中不存在的房间

房间型号:

@Entity
@Table(name="room")
public class Room implements java.io.Serializable {

    private static final long serialVersionUID = 10L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="roomId", nullable = false)
    private long Id;

    @Column(name="roomNumber", length = 4, nullable = false) //room number with max length of 4 digits
    private String roomNumber;

    @Column(name="type", nullable = false, length=10) //queen or king
    private String roomType;

    @Column(name="properties", nullable = false, length=15) //smoking or non-smoking
    private String roomProperties;

    @Column(name="price", columnDefinition = "DECIMAL(10,2)", nullable = false) //sets the precision of price to 2 decimal places
    private double price;

    public Room() {}

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public long getId() {
        return Id;
    }

    public void setId(long id) {
        this.Id = id;
    }

    public String getRoomNumber() {
        return roomNumber;
    }

    public void setRoomNumber(String roomNumber) {
        this.roomNumber = roomNumber;
    }

    public String getRoomType() {
        return roomType;
    }

    public void setRoomType(String roomType) {
        this.roomType = roomType;
    }

    public String getRoomProperties() {
        return roomProperties;
    }

    public void setRoomProperties(String roomProperties) {
        this.roomProperties = roomProperties;
    }
}
预订表:

@Entity
@Table(name="Reservation")
public class Reservation implements Serializable {

    private static final Long serialVersionUID = 100L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="reservation_Id", nullable = false)
    private long Id;

    public long getId() {
        return Id;
    }

    public void setId(long id) {
        Id = id;
    }

    @Column(name="CheckInDate")
    private Date checkInDate;

    @Column(name="CheckOutDate")
    private Date checkOutDate;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "guestId", nullable = false)
    private Guest guest;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "ReservedRooms", joinColumns = {@JoinColumn(name="resId",
    referencedColumnName = "reservation_Id")}, inverseJoinColumns = {@JoinColumn(name="roomId",
    referencedColumnName = "roomId")})
    private List<Room> roomList;

    @Column(name="roomsWanted")
    private int roomsWanted;

    public int getRoomsWanted() {
        return roomsWanted;
    }

    public void setRoomsWanted(int roomsWanted) {
        this.roomsWanted = roomsWanted;
    }

    public Date getCheckInDate() {
        return checkInDate;
    }

    public void setCheckInDate(Date checkInDate) {
        this.checkInDate = checkInDate;
    }

    public Date getCheckOutDate() {
        return checkOutDate;
    }

    public void setCheckOutDate(Date checkOutDate) {
        this.checkOutDate = checkOutDate;
    }

    public Guest getGuest() {
        return guest;
    }

    public void setGuest(Guest guest) {
        this.guest = guest;
    }

    public List<Room> getRoomList() {
        return roomList;
    }

    public void setRoomList(List<Room> roomList) {
        this.roomList = roomList;
    }
}

请告诉我我做错了什么,因为我刚开始休眠

当你加入一个集合时,你必须给它命名。不能直接使用它来取消引用

in (Select ROOMS.Id from Reservation as res 
left outer join res.roomList AS ROOMS
where res.checkInDate <=:checkInDate1 and res.checkOutDate >= :checkOutDate1 
and R.Id = ROOMS.Id)

当你加入一个集合时,你必须给它命名。不能直接使用它来取消引用

in (Select ROOMS.Id from Reservation as res 
left outer join res.roomList AS ROOMS
where res.checkInDate <=:checkInDate1 and res.checkOutDate >= :checkOutDate1 
and R.Id = ROOMS.Id)

实际上,感谢解决我的问题的响应使用联接或左外部联接会更好。实际上,感谢解决我的问题的响应使用联接或左外部联接会更好。
in (Select ROOMS.Id from Reservation as res 
left outer join res.roomList AS ROOMS
where res.checkInDate <=:checkInDate1 and res.checkOutDate >= :checkOutDate1 
and R.Id = ROOMS.Id)