嗨,我一直试图找出今天做到这一点的最好方法,但无济于事。
我理想的做法是创建一个由下面的SQL公式计算的别名距离(尽管我对其他计算距离的方式持开放态度,这只是看起来应该最简单的方式)
一旦我拥有该别名,我希望能够以限制方式使用它来查找一定距离内的所有内容。
我也希望能够通过距离进行排序。
这是构建的更大搜索条件的一部分,因此我希望继续使用Criteria。 (我已经限制了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));
目前我在sql查询中有addr3_,因为我正在查看详细输出,这就是Hibernate生成查询的方式(这个hack在我正在查看的一个实例中工作但我害怕考虑更长时间术语含义所以不希望它留在那里!!)
答案 0 :(得分:4)
在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));