Hibernate Ограничения / Критерии Вопрос для начинающих - PullRequest
3 голосов
/ 09 ноября 2010

Привет! Я пытался найти лучший способ сделать это сегодня безрезультатно.

В идеале я хотел бы создать псевдоним, рассчитываемый по формуле SQL ниже (хотя яЯ открыт для других способов вычисления расстояния, это было именно так, как казалось, это должно быть проще всего)

Как только у меня будет этот псевдоним, я хочу иметь возможность использовать его в стиле Ограничения, чтобы найти все, чтов пределах определенного расстояния.

Я также хотел бы иметь возможность сортировать по расстоянию.

Это часть более крупного критерия поиска, который построен, поэтому в идеале я хотел бы продолжать использовать критерии,(Я уже ограничил диапазон значений Lat и Long, чтобы вычисление расстояния требовалось для меньшего количества полей.

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 сгенерировал запрос (этот хак работал в одном случае, на который я смотрел, но я боюсь думать о более долгосрочных последствиях, поэтому не хотел бы, чтобы он оставался там !!)

1 Ответ

4 голосов
/ 09 ноября 2010

В ограничениях SQL вы можете ссылаться на псевдоним корневого критерия как {alias}. Чтобы использовать его в этом случае, вам нужен «подкритерий» с корнем в location.address:

Criteria criteria = session.createCriteria(Activity.class) 
       .createAlias("activityLocations", "actloc") 
       .createAlias("actloc.location", "location");

Criteria addr = criteria.createCriteria("location.address"); 
addr.add((Restrictions.and(Restrictions.between("latitude", latmin,      
       latmax), Restrictions.between("longitude", truelongmin, truelongmax)))); 

String sql =  "SQRT( POW( 69.1 * ( {alias}.latitude - " + point[1]      
       +" ) , 2 ) + POW( 69.1 * ( "+point[0] +" - {alias}.longitude ) * COS( {alias}.latitude /" 
       +" 57.3 ) , 2 ) )  < "+distance;     
addr.add(Restrictions.sqlRestriction(sql)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...