1

在 Grails 中使用 Hibernate Criteria 进行查询时遇到了一个问题。

看一看:

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

我只需要那些在fromto界限之间的月份访问次数的客户。

但现在size*限制适用于所有访问。因此,如果客户在本月访问一次,并且在上个月访问。如果我设置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被应用于所有访问,无论它有哪个日期。

// 结束更新。

让我知道是否还不清楚。

任何帮助表示赞赏。

谢谢,沃瓦。

4

2 回答 2

1

你需要一个有条款来做到这一点,我发现在 Hibernate 的 Jira 中打开的问题上添加了对此的支持。

同时,您应该使用 HQL 并手动编写查询,请参阅this。如果您不需要根据某些选定字段更改查询的限制,您应该始终使用 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 回答