Java 休眠限制/标准初学者问题
嗨,我今天一直在努力找出最好的方法来做这件事,但是没有用 理想情况下,我想做的是创建一个由下面的SQL公式计算的别名距离(尽管我对计算距离的其他方法持开放态度,但这似乎是最简单的方法) 一旦我有了这个别名,我希望能够以一种限制性的方式使用它来查找一定距离内的所有内容 我也希望能够通过距离排序 这是一个更大的搜索标准,建立了一部分,所以我想理想地继续使用标准。(我已经限制了Lat和Long值的范围,以便在较少的字段上进行所需的距离计算Java 休眠限制/标准初学者问题,java,hibernate,criteria,Java,Hibernate,Criteria,嗨,我今天一直在努力找出最好的方法来做这件事,但是没有用 理想情况下,我想做的是创建一个由下面的SQL公式计算的别名距离(尽管我对计算距离的其他方法持开放态度,但这似乎是最简单的方法) 一旦我有了这个别名,我希望能够以一种限制性的方式使用它来查找一定距离内的所有内容 我也希望能够通过距离排序 这是一个更大的搜索标准,建立了一部分,所以我想理想地继续使用标准。(我已经限制了Lat和Long值的范围,以便在较少的字段上进行所需的距离计算 Criteria criteria = session.cre
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));
Criteria=session.createCriteria(Activity.class)
.createAlias(“活动地点”、“actloc”)
.createAlias(“实际位置”、“位置”)
.createAlias(“location.address”、“addr”);
标准。添加((限制)和(限制)之间(“添加纬度”,拉丁语,
latmax),限制之间(“地址经度”,truelongmin,truelongmax));
String sql=“SQRT(POW(69.1*)(添加纬度-”+点[1]
+)2)+功率(69.1*(“+点[0]+”-addr3经度)*COS(addr3经度/”
+“57.3),2)<”+距离;
添加(Restrictions.sqlRestriction(sql));
目前,我在sql查询中添加了addr3,因为我正在查看详细的输出,而这正是Hibernate生成查询的方式(这个黑客在我正在查看的一个实例中有效,但我害怕考虑长期影响,所以不希望它停留在那里!!)在SQL限制中,您可以将条件根的别名称为
{alias}
。要在这种情况下使用它,您需要一个根在位置的“子条件”。地址
:
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));
Criteria=session.createCriteria(Activity.class)
.createAlias(“活动地点”、“actloc”)
.createAlias(“实际位置”、“位置”);
Criteria addr=Criteria.createCriteria(“location.address”);
addr.add((限制)和(限制)之间(“纬度”,latmin,
latmax),限制。介于(“经度”,truelongmin,truelongmax));
String sql=“SQRT(POW(69.1*)({alias}.latitude-”+点[1]
+)、2)+功率(69.1*(“+点[0]+”-{alias}.经度)*COS({alias}.纬度/”
+“57.3),2)<”+距离;
addr.add(Restrictions.sqlRestriction(sql));