1

GrailsのHibernateCriteriaでクエリを実行するときに問題が発生しました。

見てください:

def visitors = Client.withCriteria{
          visits{
             use ( TimeCategory ) {between('date',date,date+1.month-1)}
          }
          sizeGe("visits",params.from)
          sizeLe("visits",params.to)
          fetchMode("visits", FM.JOIN)
};

必要なのは、開始から終了までの月の訪問数が多いクライアントだけです。

ただし、現在、サイズ*の制限がすべての訪問に適用されています。したがって、クライアントが今月に1回訪問し、前月に訪問した場合。そして、from = 2に設定すると、このクライアントが結果になります。しかし、そこにあるべきではありません。

// UPD:sizeGesizeLeの制限が期待どおりに機能しないこと。

私の見解では、それらは制限の間に適用されるべきですが、そうではありません。

例えば:

def client = new Client();

client.visits.add(new Visit(date:'2010-03-16'));
client.visits.add(new Visit(date:'2010-05-16'));
client.visits.add(new Visit(date:'2010-05-17'));
client.save();

そして、私は次の場合に必要です:

  • date = Date.parse('yyyy-MM'、 '2010-05')
  • params.from = 2

基準はこのクライアントを返す必要があり、

  • params.from = 3

戻らない;
ただし、sizeGeは、日付に関係なくすべての訪問に適用されるため、戻ります。

//ENDUPD。

smthがまだ明確でない場合は、私に知らせてください。

どんな助けでも大歓迎です。

ありがとう、Vova。

4

2 に答える 2

1

これを行うには、having 句が必要です。これに対するサポートを追加するために、Hibernate の Jira で開かれている問題を見つけました。

一方で、HQL を使用して手動でクエリを作成する必要があります。これを参照してください。選択したフィールドに基づいてクエリの制限を変更する必要がない場合は、常に HQL を使用する必要があります。キャッシュすることができます。

于 2010-05-17T18:29:02.853 に答える
0

ありがとうフェリペ。

また、sqlRestriction を使用することにしました。もちろん、いくつかの移植性の問題がありますが、動作します:

def visitors = c.listDistinct{
        use(TimeCategory){
                visits{

                    between('date',date,date+1.month-1)
                }

                sqlRestriction(
                        """(
                            select count(*)
                                  from visit v
                            where
                                v.visitor_id={alias}.id
                                and v.date between 
                                      '${date.format("yyyy-MM-dd")}' 
                                      and '${(date+1.month-1).format("yyyy-MM-dd")}'
                            )
                            between ${params.from} and ${params.to}"""
                )
            }
    }

ありがとう、ヴォーヴァ。

于 2010-05-18T10:55:03.123 に答える