这里的问题是您试图表示不是您的域类的字段,例如available和occupied。试图让 HQL\GORM 做到这一点可能有点令人沮丧,但并非不可能。我想你在这里有几个选择......
1.)构建您的域类,以便更易于使用。 也许您的 Room 需要通过映射表了解它的 Reservations,或者,也许编写您希望代码看起来的样子,然后调整设计。
例如。也许你希望你的代码看起来像这样......
RoomReservation.queryAllByRoomAndDateBetween(room, arrivalDate, departureDate);
然后你会像这样实现它......
class RoomReservation{
...
def queryAllByRoomAndDateBetween(def room, Date arrivalDate, Date departureDate){
return RoomReservation.withCriteria {
eq('room', room)
and {
between('departureDate', arrivalDate, departureDate)
}
}
}
2.)我的第二个想法是...... 可以将数据库用于它的好处。有时在你的代码中使用 sql 只是做某事的最有效方式。 只需适度进行,并保持集中化和单元测试。 我不建议您使用这种方法,因为您的查询并不复杂,但它是一种选择。我将存储过程用于查询数百万个对象以获取摘要数据的“仪表板视图”之类的东西。
class Room{
...
def queryReservations(){
def sql = new Sql(dataSoruce);
return sql.call("{call GetReservations(?)}", [this.id]) //<-- stored procedure.
}
}