java - Hibernate 标准 - 排序依据

标签 java hibernate criteria

我目前有以下标准:-

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("distance","function")

理想情况下,我想在这篇文章中限制 Latmin 和 Latmax,因为这会降低结果集,从而减少计算数量(sql 也会进行两次相同的计算:S),但是任何建议将不胜感激。

干杯, 罗布

最佳答案

Hibernate 仅在这种情况下支持 native 查询:)

编辑**

我还没有测试过它,但类似下面的东西应该可以工作:

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

关于java - Hibernate 标准 - 排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144401/

相关文章:

java - 如何安装android studio?

mysql - 在 Ubuntu 12.04 上为 MySQL 配置 hibernate.cfg.xml

audio - 根据与Google表格上的Googlefinance公式相关的标准播放声音

java - Jpa条件,将枚举类型转换为字符串

java - 尝试创建 ArrayList 时出现 NullPointerException

java - log4j2 StringMapMessage无法获取自定义消息

java - fork/join,输入数组是否需要同步?

mysql - 关于spring/jpa/hibernate中乐观锁的简单设计问题

java - 如何在@Transactional注释方法中将状态提交到数据库?

java - Hibernate查询异常: could not resolve property