【发布时间】:2014-12-06 10:49:07
【问题描述】:
我有以下课程:
@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 代码中过滤它们,但我只想加载必要的对象。可能吗?我有方法可以检查圆圈内的那个点。
我目前的道法:
@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:
【问题讨论】:
-
你有没有为此写过任何查询?与我们分享,以便我们为您提供更多帮助。
-
@OO7 我更新了话题
-
您需要将您的
distFrom()方法翻译成HQL 或SQL。 -
@JB Nizet 是的,你是对的,但我不知道怎么做。我添加了 dist 方法相关化
-
@gstackoverflow 您说,您希望所有终端都在通过的中心和半径内。数据库中有没有适合他们的字段?还是有一些特殊情况?
标签: java database hibernate filtering criteria