Java 使用not in with join和BETHEN with HQL

Java 使用not in with join和BETHEN with HQL,java,hibernate,postgresql,hql,jpql,Java,Hibernate,Postgresql,Hql,Jpql,我正在尝试将此postgresql转换为hql,但我无法理解: 我不知道我是否可以在这里或只是在标准之间使用 SELECT * FROM room where id not in( SELECT room.id FROM room LEFT OUTER JOIN reservation_room ON room.id = reservation_room.roomid left outer join reservation on reservation

我正在尝试将此postgresql转换为hql,但我无法理解: 我不知道我是否可以在这里或只是在标准之间使用

SELECT * FROM room where id not in(
    SELECT room.id FROM room  LEFT
    OUTER  JOIN reservation_room ON
    room.id = reservation_room.roomid
    left outer join reservation on
    reservation_room.reservationid = reservation.id
    where :startdate between reservation.checkin_date and reservation.checkout_date - interval '1' day or
    :enddate between reservation.checkin_date + interval '1' day and reservation.checkout_date
    )
此查询将返回一个列表,我需要将返回映射到此列表或创建一个本机查询来执行此操作

package com.hotel.model;

import java.io.Serializable;
import java.util.List;
import java.util.Locale;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

/**
 * The persistent class for the room database table.
 * 
 */
@Entity
@Table(name = "room")
public class Room implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "ROOM_ID_GENERATOR", sequenceName = "room_id_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ROOM_ID_GENERATOR")
    @Column(unique = true, nullable = false)
    private Long id;

    @Column(name = "room_number")
    private Integer roomNumber;

    @Column(length = 1)
    private String occupied;

    // bi-directional many-to-one association to RoomType
    @ManyToOne
    @JoinColumn(name = "room_typeid", nullable = false)
    private RoomType roomType;

    // bi-directional many-to-many association to Reservation
    @ManyToMany
    @JoinTable(name = "reservation_room", joinColumns = {
            @JoinColumn(name = "reservationid", nullable = false)
    }, inverseJoinColumns = {
            @JoinColumn(name = "roomid", nullable = false)
    })
    private List<Reservation> reservations;

    public Room() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(final Long id) {
        this.id = id;
    }

    public Integer getRoomNumber() {
        return this.roomNumber;
    }

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

    public String getOccupied() {
        return this.occupied;
    }

    public void setOccupied(final String occupied) {
        this.occupied = occupied;
    }

    public RoomType getRoomType() {
        return this.roomType;
    }

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

    public List<Reservation> getReservations() {
        return this.reservations;
    }

    public void setReservations(final List<Reservation> reservations) {
        this.reservations = reservations;
    }



}
package com.hotel.model;
导入java.io.Serializable;
导入java.util.List;
导入java.util.Locale;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.JoinColumn;
导入javax.persistence.JoinTable;
导入javax.persistence.ManyToMany;
导入javax.persistence.manytone;
导入javax.persistence.SequenceGenerator;
导入javax.persistence.Table;
/**
*房间数据库表的持久类。
* 
*/
@实体
@表(name=“房间”)
公共教室实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@SequenceGenerator(name=“ROOM\u ID\u GENERATOR”,sequenceName=“ROOM\u ID\u seq”,allocationSize=1,initialValue=1)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“房间ID\U生成器”)
@列(unique=true,nullable=false)
私人长id;
@列(name=“房间号”)
私有整数;
@列(长度=1)
私人字符串占用;
//与RoomType的双向多对一关联
@许多酮
@JoinColumn(name=“room\u typeid”,nullable=false)
私人房型房型;
//双向多对多关联到保留
@许多
@JoinTable(name=“预订房间”,JointColumns={
@JoinColumn(name=“reservationid”,null=false)
},反向连接列={
@JoinColumn(name=“roomid”,nullable=false)
})
私人名单预订;
公共房间(){
}
公共长getId(){
返回此.id;
}
公共无效集合id(最终长id){
this.id=id;
}
公共整数getRoomNumber(){
返回此.roomNumber;
}
public void setRoomNumber(最终整数roomNumber){
this.roomNumber=roomNumber;
}
公共字符串getoccumposed(){
把这个还给我;
}
已占用公共空间集合(已占用最终字符串){
有人占了;
}
公共RoomType getRoomType(){
返回此.roomType;
}
公共void setRoomType(最终RoomType RoomType){
this.roomType=roomType;
}
公共列表{
把这封信寄回。预订;
}
公共预订(最终列表预订){
这个。保留=保留;
}
}

感谢您的帮助。

您可以在Hibernate中使用SqlQuery,而不是将其转换为HQL。我的意思是,您可以使用与上面相同的SQL并使Hibernate返回与该结果匹配的房间实体。请查看以了解更多信息。

您可以在Hibernate中使用SqlQuery,而不是将其转换为HQL。我的意思是,您可以使用与上面相同的SQL并使Hibernate返回与该结果匹配的房间实体。请看一看以了解更多信息