2010-11-10 4 views
1

у меня в настоящее время ниже критерии: -Hibernate Критерии - Сортировать по

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

То, что я хотел бы сделать в идеале, чтобы иметь возможность сделать заказ на расстояние. MySql эквивалент существо: -

SELECT * , (
SQRT(POW(69.1 * (latitude - 51.3814282) , 2) + POW(69.1 * (- 2.3574537 - longitude) * COS(latitude/57.3) , 2)) 
) AS distance 
FROM `address` 
WHERE (
SQRT(POW(69.1 * (latitude - 51.3814282) , 2) + POW(69.1 * (- 2.3574537 - longitude) * COS(latitude/57.3) , 2)) 
) < 10.0 
ORDER BY distance DESC 
LIMIT 0 , 30 

Что такое лучший способ сделать это в Hibernate? Я пробовал createCriteria/createAlias ​​(«расстояние», «функция»)

В идеале я хотел бы сделать это сообщение ограничением на Latmin и Latmax, поскольку это снижает набор результатов и, следовательно, число вычислений (также sql делает тот же расчет дважды: S), однако любые предложения были бы наиболее оценены.

Приветствия, Роб

ответ

2

Hibernate поддерживает собственные запросы только для ситуаций, как это :)

EDIT **

Я не проверял, но что-то вроде должно работать:

StringBuilder sql = new StringBuilder(); 

sql.append("SELECT *"); 
sql.append(", (SQRT(POW(69.1 * (latitude - 51.3814282) , 2) + POW(69.1 * (- 2.3574537 - longitude) * COS(latitude/57.3) , 2))) AS distance"); 
sql.append(" FROM `address`"); 
sql.append(" WHERE (SQRT(POW(69.1 * (latitude - 51.3814282) , 2) + POW(69.1 * (- 2.3574537 - longitude) * COS(latitude/57.3) , 2))) < 10.0"); 
sql.append(" ORDER BY distance DESC"); 
sql.append(" LIMIT 0 , 30"); 

SQLQuery query = session.createSQLQuery(sql.toString()); 
// call query.addScalar(..) for other fields you select 
query.addScalar("distance", Hibernate.BIG_DECIMAL) 

//Where AddressBean is the object that maps to a row of this resultset 
query.setResultTransformer(Transformers.aliasToBean(AddressBean.class)); 

List<AddressBean> list = new ArrayList<AddressBean>(100); 
for (Object object : query.list()) { 
    list.add((AddressBean)object); 
} 
Смежные вопросы