gpt4 book ai didi

grails - 使用Grails避免HQL中的子查询

转载 作者:行者123 更新时间:2023-12-02 15:36:00 25 4
gpt4 key购买 nike

我有两个对象,房间类型和预订。简化为:

class Room {
String description
int quantity
}

class Reservation {
String who
Room room
}

我想查询所有房间以及每种类型的可用房间数。在SQL中,这就是我想要的:
select id, quantity, occupied, quantity-coalesce(occupied, 0) as available
from room left join(select room_id, count(room_id) as occupied from reservation)
on id = room_id;

我什么也不想尝试使用HQL做到这一点。

我会感激任何指针,因为似乎我在HQL或GORM中缺少了相当基本的东西。

最佳答案

这里的问题是您试图表示不是您的域类的字段,例如availableoccupied。试图让HQL \ GORM执行此操作可能会有些令人沮丧,但并非没有可能。我认为您在这里有两种选择...

1.)构建您的域类,以使其更易于使用。 也许您的房间需要通过映射表了解其预订情况,或者也许写出您想要的代码外观,然后调整设计。

例如。也许您希望您的代码看起来像这样...

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只是做某事的最有效方法。 只需适度执行,并保持集中和单元测试即可。 我不建议您使用这种方法,因为查询并不那么复杂,但是它是一个选择。我将存储过程用于“仪表盘 View ”之类的事情,该过程可查询数百万个对象以获取摘要数据。
class Room{
...
def queryReservations(){
def sql = new Sql(dataSoruce);
return sql.call("{call GetReservations(?)}", [this.id]) //<-- stored procedure.
}
}

关于grails - 使用Grails避免HQL中的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com