2010-05-16 32 views
1

我在使用Grails中的Hibernate Criteria查詢時遇到了一個問題。Hibernate標準中的協調規模

請看:

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) 
}; 

我只需要這些客戶端,其中有數量從訪問在之間的一個月,界限。

但現在大小*限制正在適用於所有訪問。所以如果客戶在本月訪問一次,並且在上個月訪問。如果我設置= 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.parse( 'YYYY-MM', '2010-05')
  • params.from = 2個

標準應該返回該客戶端,並且如果

  • params.from = 3

不會返回;
但它返回,因爲尺寸鍺正在應用於所有訪問,無論它具有哪個日期。

// END UPD。

讓我知道如果smth仍然不清楚。

任何幫助表示讚賞。

謝謝,Vova。

+0

您能詳細說明嗎? – 2010-05-16 20:00:36

回答

1

你需要一個條款來做到這一點,我發現在issue open in Hibernate's Jira增加支持。

同時您應該使用HQL並手動編寫查詢,see this。如果您不需要根據某些選定的字段更改查詢的限制,您應該始終使用HQL,它可以被緩存。

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}""" 
       ) 
      } 
    } 

謝謝,Vova。