0

部屋タイプと予約の 2 つのオブジェクトがあります。簡略化すると、次のとおりです。

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 のいずれかでかなり基本的な何かが欠けているように見えるので、ポインタをいただければ幸いです。

4

2 に答える 2

1

ここでの問題は、availableやのようなドメインクラスではないフィールドを表現しようとしていることoccupiedです。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.)私の2番目の考えは... データベースを何に役立つかのために使用しても大丈夫です。コードでSQLを使用することが、何かを行うための最も効果的な方法である場合があります。 適度にそれを行い、一元化して単体テストを続けてください。 クエリはそれほど複雑ではないため、このアプローチを使用することはお勧めしませんが、これはオプションです。何百万ものオブジェクトに要約データを照会する「ダッシュボードビュー」などのストアドプロシージャを使用します。

class Room{
    ...
  def queryReservations(){
      def sql = new Sql(dataSoruce);
      return sql.call("{call GetReservations(?)}", [this.id]) //<-- stored procedure.
  }
}
于 2012-05-14T12:23:00.270 に答える
0

HQL でサブクエリを使用した左結合をどのように記述できるかわかりません。どのような場合でも、HQL の表現力が十分でない場合は、生の SQL を Grails で簡単に実行することもできます。

サービスに dataSource を注入し、groovy.sql.Sql インスタンスを作成します

def dataSource

[...]    

def sql= new Sql(dataSource)
sql.eachRow("...."){row->
    [...]
}

質問に答えたり黙ったりする代わりに、人々があなたの考え方をひいきにしようとするのは非常に迷惑なことだと思いますが、私の意見では、このクエリは十分に複雑であるため、この概念を作成します私のデータ構造の数、おそらく部屋に関連付けられた可用性テーブルであり、数量だけでなく占有値もカウントします。

これは、必要になるたびに計算するのではなく、.

私の $.02 だけは、気に障る場合は無視してください。

于 2012-05-14T08:13:31.613 に答える