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)