2015-11-12 31 views
1

我想做一個查詢購買我沒有訪問到h2數據庫模式,所以我不知道如何命名連接屬性。 我基本上想要在特定的日期間隔內查詢酒店中的可用房間。對於我需要一個這樣的查詢:Java Spring查詢

Select Room 
    From Room Inner Join Booking On Room.Id = Booking.RoomId Inner Join RoomType On RoomType.Id = Room.RoomTypeId 
    Where NOT ((Booking.beginDate >= @initDate And Booking.beginDate <= @endtDate) or (Booking.beginDate >= @initDate And Booking.endDate <= @endDate) 
or (Booking.beginDate <= @initDate and Booking.endDate >= @endDate)) and Booking.Approved = 1 and RoomType.Id = @roomType) 

在java中春:

@Query(........) 
Iterable<Room> findAvaiableRooms(Date initDate, Date endDate, long roomType); 

######## The Entities ####### 

@Entity 
public class Booking { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 
    private Date beginDate; 
    private Date endDate; 
    private boolean aproved; 

    @ManyToOne 
    private Room room; 
} 



@Entity 
    public class Room { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private long id; 
     private String name; 

     @ManyToOne 
     private RoomType roomType; 

     @OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="room", orphanRemoval = true) 
     private Collection<Booking> bookings = new ArrayList<Booking>(); 
    } 

@Entity 
public class RoomType { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String type; 
    private int price; 
    private int numberOfRooms; 

    @OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="roomType", orphanRemoval = true) 
    private Collection<Room> rooms = new ArrayList<Room>(); 
} 

我真的不知道該如何查詢應爲與數據庫一致。

+0

如果您無權訪問h2數據庫,您如何才能執行查詢? – Stefan

+0

你可以執行一個正常的sql查詢「select * from

」並查看metdata以查看列名? – Thevenin

+0

@Stefan我有權訪問數據庫,我只是不知道如何查看數據庫模式 – MMrj

回答

1

您可以直接在您的註解定義了聯接列的名稱:

@Entity 
public class Booking { 

    @ManyToOne 
    @JoinColumn(name="room_id") 
    private Room room; 
} 

@Entity 
public class Room { 

    @ManyToOne 
    @JoinColumn(name="roomType_id") 
    private RoomType roomType; 

} 

或者你也可以嘗試JPA查詢,而不是和使用對象的關係,而不是表的

select Room r 
from Room 
join r.bookings b 
where 
not ( (b.beginDate >= :initDate And b.beginDate <= :endtDate) 
    or (b.beginDate >= :initDate And b.endDate <= :endDate) 
    or (b.beginDate <= :initDate and b.endDate >= :endDate) 
) 
and b.approved = true 
and r.roomType = :roomType) 
2

事實上,你有ORM的所有這些註釋使我相信你正在使用Hibernate。

我會勸你忘掉ORM,直到你能自己感覺更舒適。

您正在依賴Hibernate爲您創建表格,而未完全理解它會給您帶來什麼。

您不知道如何編寫JOIN,因此您依賴於Hibernate爲您生成的SQL。

手動創建表格。編寫一個使用手工SQL的數據訪問類。手動將這些結果映射到您的對象中。

一旦你完成了,你會真正明白這個問題。

您將欣賞(或鄙視)Hibernate爲您提供的內容,並瞭解它如何更好地工作。