【问题标题】:Hibernate Criteria - Order By休眠标准 - 排序依据
【发布时间】:2010-11-10 12:22:38
【问题描述】:

我目前有以下标准:-

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),但是任何建议都将不胜感激。

干杯, 抢

【问题讨论】:

    标签: java hibernate criteria


    【解决方案1】:

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

    编辑**

    我还没有测试过,但应该可以使用以下方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2012-12-24
      • 2021-10-19
      相关资源
      最近更新 更多