我有以下课程:
@Entity
@Table(name = "terminal")
public class Terminal {
@Column(name = "map_lat")
private Double mapLat;
@Column(name = "map_lng")
private Double mapLng;
//get and set methods
}
我在数据库中分别对应表格。
我想写dao方法,它将返回所有将在传递的半径和中心内定位的终端。我知道我可以加载所有对象并在java代码中过滤它们,但我想只加载必要的对象。可能吗?我有方法检查cicrcle里面的那个点。
我当前的dao方法:
@Override
public List<Terminal> findInsideCircleActive(double centerLatitude, double centerLongitude, double radius) {
List<Terminal> allTerminals = findAllActive() ;
List<Terminal> filteredTerminals = new ArrayList<>();
for(Terminal terminal: allTerminals){
if(distFrom(terminal.getMapLat(),terminal.getMapLng(),centerLatitude,centerLongitude) <= radius ){
filteredTerminals.add(terminal);
}
}
return filteredTerminals;
}
dist
方法实现:
private static float distFrom(double lat1, double lng1, double lat2, double lng2) {
double earthRadius = 6371; //kilometers
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLng/2) * Math.sin(dLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
float dist = (float) (earthRadius * c);
return dist;
}
数据库shema:
答案 0 :(得分:0)
这可以通过将标准应用于查询并使用findByCriteria()而不是list()
来完成。从我的一个项目中查看这个DAO函数:
@Override
public List<Project> listByOwner(User owner) {
DetachedCriteria c = DetachedCriteria crit = DetachedCriteria.forClass(Projects.class);
c.add(Restrictions.eq("deleted", false));
c.add(Restrictions.eq("owner", owner));
c.addOrder(Order.desc("dateEdit"));
return new HibernateTemplate(sessionFactory).findByCriteria(c);
}
如果您的问题与编写查询无关,而是与您特别想要过滤经度和纬度相关,那么请给Hibernate-Spatail一个机会。是专门为此而构建的:http://www.hibernatespatial.org