我有两个域Offer和Station。我编写了一个条件查询,该查询将返回距出发站(Offer.origin)和所有可能的目标站(Offer.stations)25000米以内的所有报价。它可以工作,因为我想删除一个hack。
hack是我在sqlRestriction中使用表名别名引用/前缀列名纬度和经度,这些别名是我通过查看正在执行的原始SQL获得的。它可以工作,但是当然,如果底层的ORM实现发生更改,则此代码将中断。
我试图通过使用createAlias()来引用纬度和经度,但这不起作用,因为它们超出了sqlRestriction中SQL代码的范围。使用{alias} .latitude {alias} .logitude将创建“ this_.latitude”和“ this_.longitude”的原始SQL,这也无济于事。
sqlRestriction中的“ origin_ali1_.latitude,origins_ali1_.longitude”和“ stations_a2_.latitude,stations_a2_.longitude”的替换是什么?
在Hibernate Restrictions / Criteria Beginner Question处有一个类似问题的用户,但我使用的是grails,Offer.createCriteria()返回BuildableCriteria而不是Criteria。
有没有Grails / Gorm / Hibernate Gurus可以使用Criteria API解决此问题?
class Offer implements Serializable {
Station origin
static hasMany = [stations: Station,bookings: Booking]
Date startDate
....
}
class Station implements Serializable {
BigDecimal latitude
BigDecimal longitude
...
}
def readOffers(Thing from,Thing to,Date departureDate){
BuildableCriteria offerCriteria = Offer.createCriteria()
Closure c = {
ge('endDate',new Date())
if (departureDate != null)
{
sqlRestriction 'date(end_date) >= ?',[departureDate]
sqlRestriction 'date(start_date) <= ?',[departureDate]
}
origin {
sqlRestriction '(earth_distance( ll_to_earth(?,?),ll_to_earth(origin_ali1_.latitude,origin_ali1_.longitude)) < 25000)',[from.latitude,from.longitude]
}
stations {
sqlRestriction '(earth_distance( ll_to_earth(?,ll_to_earth(stations_a2_.latitude,stations_a2_.longitude)) < 25000)',[to.latitude,to.longitude]
}
}
return offerCriteria.listDistinct(c)
}