迁移 Spring Roo web mvc 到 gvNIX 数据表:如何过滤记录?
Migration Spring Roo web mvc to gvNIX datatables: how to filter records?
一个用例是仅显示登录用户his/her自己的付款,而不是所有付款。
在“old web mvc scaffold”列表视图中,我推入了 list 方法并将其更改为检索当前登录用户的所有付款记录,请参见下面的代码。
现在我想迁移到 gvNIX 数据表。默认显示数据库中的所有记录。
问题:如何只过滤该用户的记录?
一个简单的例子会很棒或更多文档。
@RequestMapping(produces = "text/html")
public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) {
System.out.println("In payment list controller");
if (page != null || size != null) {
int sizeNo = size == null ? 10 : size.intValue();
final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo;
// uiModel.addAttribute("payments", Payment.findPaymentEntries(firstResult, sizeNo, sortFieldName, sortOrder));
User currentUser = getCurrentUser();
List<Payment> paymentList = Payment.findPaymentsByPayUser(getCurrentUser(), firstResult, sizeNo, "transactionDate", "DESC");
uiModel.addAttribute("payments", paymentList);
float nrOfPages = (float) Payment.countFindPaymentsByPayUser(currentUser) / sizeNo;
uiModel.addAttribute("maxPages", (int) ((nrOfPages > (int) nrOfPages || nrOfPages == 0.0) ? nrOfPages + 1 : nrOfPages));
} else {
// uiModel.addAttribute("payments", Payment.findAllPayments(sortFieldName, sortOrder));
uiModel.addAttribute("payments", Payment.findPaymentsByPayUser(getCurrentUser(), "transactionDate", "DESC").getResultList());
}
addDateTimeFormatPatterns(uiModel);
return "payments/list";
}
private User getCurrentUser() {
// Retrieve the current logged in user and his authentication
String username = SecurityContextHolder.getContext().getAuthentication().getName();
// Retrieve the user object of the current user
User user = User.findUsersByEmailAddress(username).getSingleResult();
return user;
}
由于 Datatables 使用 Ajax 请求来检索数据,因此 list
方法用作页面抽屉(这是通过 _Roo_GvNIXDatatables.aj
上的 declare precedence
AspectJ 指令完成的) .
要自定义 Datatables 获取的数据,您应该推入 setDatatablesBaseFilter
。您可以在 _Roo_GvNIXDatatables.aj
文件中找到它。你可以在你的控制器中尝试这样的事情:
public void setDatatablesBaseFilter(Map<String, Object> propertyMap) {
// Add here your baseFilters to propertyMap.
propertyMap.put("paymentUser", getCurrentUser());
}
如果您需要更复杂的过滤器,您应该自定义 findAllXXX
和 retrieveData
方法(第一个用于数据可视化,第二个用于导出功能)。
祝你好运!
一个用例是仅显示登录用户his/her自己的付款,而不是所有付款。
在“old web mvc scaffold”列表视图中,我推入了 list 方法并将其更改为检索当前登录用户的所有付款记录,请参见下面的代码。
现在我想迁移到 gvNIX 数据表。默认显示数据库中的所有记录。
问题:如何只过滤该用户的记录?
一个简单的例子会很棒或更多文档。
@RequestMapping(produces = "text/html")
public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) {
System.out.println("In payment list controller");
if (page != null || size != null) {
int sizeNo = size == null ? 10 : size.intValue();
final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo;
// uiModel.addAttribute("payments", Payment.findPaymentEntries(firstResult, sizeNo, sortFieldName, sortOrder));
User currentUser = getCurrentUser();
List<Payment> paymentList = Payment.findPaymentsByPayUser(getCurrentUser(), firstResult, sizeNo, "transactionDate", "DESC");
uiModel.addAttribute("payments", paymentList);
float nrOfPages = (float) Payment.countFindPaymentsByPayUser(currentUser) / sizeNo;
uiModel.addAttribute("maxPages", (int) ((nrOfPages > (int) nrOfPages || nrOfPages == 0.0) ? nrOfPages + 1 : nrOfPages));
} else {
// uiModel.addAttribute("payments", Payment.findAllPayments(sortFieldName, sortOrder));
uiModel.addAttribute("payments", Payment.findPaymentsByPayUser(getCurrentUser(), "transactionDate", "DESC").getResultList());
}
addDateTimeFormatPatterns(uiModel);
return "payments/list";
}
private User getCurrentUser() {
// Retrieve the current logged in user and his authentication
String username = SecurityContextHolder.getContext().getAuthentication().getName();
// Retrieve the user object of the current user
User user = User.findUsersByEmailAddress(username).getSingleResult();
return user;
}
由于 Datatables 使用 Ajax 请求来检索数据,因此 list
方法用作页面抽屉(这是通过 _Roo_GvNIXDatatables.aj
上的 declare precedence
AspectJ 指令完成的) .
要自定义 Datatables 获取的数据,您应该推入 setDatatablesBaseFilter
。您可以在 _Roo_GvNIXDatatables.aj
文件中找到它。你可以在你的控制器中尝试这样的事情:
public void setDatatablesBaseFilter(Map<String, Object> propertyMap) {
// Add here your baseFilters to propertyMap.
propertyMap.put("paymentUser", getCurrentUser());
}
如果您需要更复杂的过滤器,您应该自定义 findAllXXX
和 retrieveData
方法(第一个用于数据可视化,第二个用于导出功能)。
祝你好运!