Критерии гибернации - заказ по - PullRequest
1 голос
/ 10 ноября 2010

В настоящее время у меня есть следующие критерии: -

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), однако любые предложения будут наиболее цениться.

Cheers, Rob

1 Ответ

2 голосов
/ 30 июня 2011

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...