所以我现在有类似的事情http://codepen.io/anon/pen/bBgVOL
它需要一个位置,将它传递给GET ajax调用,该调用返回lat / lng,然后将其传递给我的控制器。 (是的我知道它很乱)
@RequestMapping(value = "/rentals", method = RequestMethod.GET)
public String rentResults(@RequestParam(value = "page", required = false) Integer pageNumber, @RequestParam(value = "lat", required = false) String lat, @RequestParam(value = "lng", required = false) String lng, @RequestParam(value = "rad", required = false) String rad, Map model) {
int total = 25;
if (pageNumber == null) {
pageNumber = 1;
} else {
pageNumber = (pageNumber - 1) * total + 1;
}
List<ForRent> rentals = new ArrayList();
int count;
if (lat == null && lng == null && rad == null) {
rentals = forRentDao.getRentalsByPage(pageNumber, total);
count = forRentDao.getNumOfRentals();
} else {
count = forRentDao.RentalRadiusCount(lat, lng, rad);
rentals = forRentDao.RentalRadius(lat, lng, rad, pageNumber, total);
String latParam = "&lat=" + lat;
String lngParam = "&lng=" + lng;
String radParam = "&rad=" + rad;
model.put("latParam", latParam);
model.put("lngParam", lngParam);
model.put("radParam", radParam);
}
int page;
if (count % total == 0) {
page = (count / total);
} else {
page = 1 + (count / total);
}
List<Integer> pages = new ArrayList();
for (int i = 1; i <= page; i++) {
pages.add(i);
}
model.put("pages", pages);
model.put("rentals", rentals);
boolean rent = true;
model.put("rent", rent);
return "rent";
}
js
function initMap() {
var input = /** @type {!HTMLInputElement} */(
document.getElementById('address'));
var autocomplete = new google.maps.places.Autocomplete(input);
};
$('#searchRadius').on('click', function (e) {
var lati;
var lng;
var address = $('#address').val();
var rad = $('#radius').val();
var select = document.getElementById('sel');
var choice = select.value;
e.preventDefault();
$.ajax({
type: "GET",
url: "http://www.mapquestapi.com/geocoding/v1/address?key=&location=" + address,
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-type", "application/json");
},
success: function postForm(response) {
lati = response.results[0].locations[0].latLng.lat;
lng = response.results[0].locations[0].latLng.lng;
if (rad == null) {
rad = '10';
}
console.log(lati, lng, rad);
var data = JSON.stringify({
lat: lati,
lng: lng,
rad: rad
});
if (choice == 1) {
$.ajax({
url: contextRoot + "/map/radius",
type: "POST",
data: data,
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-type", "application/json");
},
success: function (data, status) {
console.log(data);
window.location = contextRoot + "/rent/rentals?lat=" + data.lat + "&lng=" + data.lng + "&rad=" + data.rad;
},
error: function (data, status) {
alert("bad api call");
console.log(status);
}
});
}
},
error: function (data, status) {
console.log(data.errors);
}}
);
});
所以现在它要么返回没有lat / lng / radius参数的租赁列表,要么返回带有应用参数的列表。
我需要为此添加大约5-10个参数(例如http://codepen.io/anon/pen/QGdjoB)
我现在设置控制器的方式很可能不会工作,并且将会是一个巨大的麻烦,因为我需要很多基于参数的if / else语句。我目前正在使用SQL查询过滤数据。返回所有数据并在内存中过滤它是否更好?还是有更好/更有效的方法来设置此控制器响应?
谢谢!
答案 0 :(得分:0)
您的数据库将针对搜索和过滤进行优化;这是它的主要用例。此外,数据库可以访问Java不具备的索引。此外,与您在Java中尝试的任何内容相比,数据库可能实现更快的搜索。例如,数据库的搜索实现可以使用并发性。
但是,它并非完全黑白分明。也许数据库的硬件非常慢;在那种情况下:也许Java应用程序服务器可以更快地进行过滤。也许数据库位于机械硬盘上,因此随机访问速度慢(这会使得利用索引变得很糟糕......虽然Java根本没有任何索引)。我仍然建议将工作推送到数据库,因为是的用途。
当然,也许您的搜索/过滤条件不适合关系数据库模型。考虑具有数据依赖性的过滤条件 - 例如&#34;找到旧车存在的每辆车&#34;。这在SQL中有点火腿(我假设很慢)。数据库只能快速完成它所设计的工作。
如果实际上 很重要,请对其进行基准测试。尝试两种方式,并进行测量。
如果性能没有重要:问问自己哪些代码难以维护。以动态,参数化的方式构造SQL查询可能会非常难看。但是在Java中使用数据结构进行操作也会非常难看。
答案 1 :(得分:0)
我现在设置控制器的方式很可能不会起作用,并且将会是一个巨大的麻烦,因为我需要很多基于参数的if / else语句。
你肯定不会。这就是我用五个标准进行搜索的方式:
.addInUnlessNull("supplier.id", idList)
.addEqUnlessNull("id", input.templateId)
.addEqIf(!request.includeDeleted(), "isDeleted", false)
.addEqUnlessNull("branch.id", input.branchId)
.addEqUnlessNull("supplier.id", input.supplierId)
我正在使用Hibernate,但这并不重要,因为这是我自己的简单接口,也可以用于纯SQL。就像
一样MyQuery addEqUnlessNull(String path, @Nullable Object value) {
if (value != null) {
sql.append(" AND " + path + " = ?");
args.append(value);
}
return this;
}
应该这样做。小心SQL注入。查询中使用的部件永远不应来自用户。每个不安全的输入都必须用作SQL参数,或者至少要正确转义。
但不要重新发明轮子,请查看querydsl或类似内容。 Java中的纯SQL非常过时。我的主要观点是,对于每次重复操作,如果你编写方法,你只需要一行。
在数据库中执行所有操作通常是最简单的,也可能是最快的。您可以轻松加快在重要标准上添加索引的速度。请注意,索引会使写入速度变慢,并且每个表最多只能使用一个索引。
在运行之前我不打算再进行优化,并获取一些使用统计信息。没有它们,你可以在极少数情况下浪费你的时间。
如果整个列表不是太长,您可能希望采用不同的方式: - 在数据库中过滤。 - 申请表中没有任何内容。 - 在客户端中对排序和分页进行排序和分页(即将结果减少到属于页面的内容)。
或者,您可以在客户端中进行一些额外的过滤。