Привет, я пытался найти лучший способ сделать это сегодня, но безрезультатно.
В идеале я хотел бы создать псевдоним расстояния, рассчитанный по приведенной ниже формуле SQL (хотя я открыт для других способов расчета расстояния, это был именно тот способ, который казался самым простым)
Когда у меня будет этот псевдоним, я хочу иметь возможность использовать его в режиме ограничений, чтобы найти все, что находится на определенном расстоянии.
Я также хотел бы иметь возможность сортировать по расстоянию.
Это часть более крупного критерия поиска, поэтому в идеале я хотел бы продолжать использовать Критерии. (Я уже ограничиваю диапазон значений широты и долготы, чтобы расчет расстояния требовался для меньшего количества полей.
Criteria criteria = session.createCriteria(Activity.class)
.createAlias("activityLocations", "actloc")
.createAlias("actloc.location", "location")
.createAlias("location.address", "addr");
criteria.add((Restrictions.and(Restrictions.between("addr.latitude", latmin,
latmax),Restrictions.between("addr.longitude", truelongmin, truelongmax))));
String sql = "SQRT( POW( 69.1 * ( addr3_.latitude - " + point[1]
+" ) , 2 ) + POW( 69.1 * ( "+point[0] +" - addr3_.longitude ) * COS( addr3_.latitude /"
+" 57.3 ) , 2 ) ) < "+distance;
criteria.add(Restrictions.sqlRestriction(sql));
В настоящее время у меня есть addr3_ в sql-запросе, потому что я просматривал подробный вывод, и именно так Hibernate сгенерировал запрос (этот хак работал в одном экземпляре, на который я смотрел, но я боюсь думать о долгосрочных последствиях, поэтому Не хотелось бы, чтобы он там оставался!!)