Grails 3.3.9应用程序中条件中sqlRestriction中的参考列

我有两个域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)
}
syf19967709 回答:Grails 3.3.9应用程序中条件中sqlRestriction中的参考列

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2849320.html

大家都在问