我找到了有关如何实现ajax服务器端处理的示例。在控制器上,代码如下所示。
@RequestMapping(value = "/persons")
public @ResponseBody
DatatablesResponse<Person> findAllForDataTablesFullSpring(@DatatablesParams DatatablesCriterias criterias) {
DataSet<Person> dataSet = personService.findPersonsWithDatatablesCriterias(criterias);
return DatatablesResponse.build(dataSet, criterias);
}在服务层上
public DataSet<Person> findPersonsWithDatatablesCriterias(DatatablesCriterias criterias) {
List<Person> persons = personRepository.findPersonWithDatatablesCriterias(criterias);
Long count = personRepository.getTotalCount();
Long countFiltered = personRepository.getFilteredCount(criterias);
return new DataSet<Person>(persons, count, countFiltered);
}在数据访问层上
@Override
public List<Person> findPersonWithDatatablesCriterias(DatatablesCriterias criterias) {
StringBuilder queryBuilder = new StringBuilder("SELECT p FROM Person p");
/**
* Step 1: global and individual column filtering
*/
queryBuilder.append(PersonRepositoryUtils.getFilterQuery(criterias));
/**
* Step 2: sorting
*/
if (criterias.hasOneSortedColumn()) {
List<String> orderParams = new ArrayList<String>();
queryBuilder.append(" ORDER BY ");
for (ColumnDef columnDef : criterias.getSortingColumnDefs()) {
orderParams.add("p." + columnDef.getName() + " " + columnDef.getSortDirection());
}
Iterator<String> itr2 = orderParams.iterator();
while (itr2.hasNext()) {
queryBuilder.append(itr2.next());
if (itr2.hasNext()) {
queryBuilder.append(" , ");
}
}
}
TypedQuery<Person> query = entityManager.createQuery(queryBuilder.toString(), Person.class);
/**
* Step 3: paging
*/
query.setFirstResult(criterias.getDisplayStart());
query.setMaxResults(criterias.getDisplaySize());
return query.getResultList();
}
/**
* <p>
* Query used to return the number of filtered persons.
*
* @param criterias
* The DataTables criterias used to filter the persons.
* (maxResult, filtering, paging, ...)
* @return the number of filtered persons.
*/
@Override
public Long getFilteredCount(DatatablesCriterias criterias) {
StringBuilder queryBuilder = new StringBuilder("SELECT p FROM Person p");
queryBuilder.append(PersonRepositoryUtils.getFilterQuery(criterias));
Query query = entityManager.createQuery(queryBuilder.toString());
return Long.parseLong(String.valueOf(query.getResultList().size()));
}
/**
* @return the total count of persons.
*/
@Override
public Long getTotalCount() {
Query query = entityManager.createQuery("SELECT COUNT(p) FROM Person p");
return (Long) query.getSingleResult();
}我的问题是,我需要重复编码数据访问层,这对于我的所有实体来说都是完全相同的。现在,我在考虑有一个通用的实现。有人能给我这个问题的解决方案吗?这对任何使用Dandelion Datatables插件的人都是一个很大的帮助。
发布于 2016-02-04 15:35:00
因为我最近在做同样的任务,所以我可以给你几个建议。首先,您一定要了解一下Spring Data,因为Spring框架的这一部分为您提供了数据库访问级别所需的一切。您需要创建一个扩展JpaRepository的@Repository,然后从这里查询您的数据库。因此,例如,可以用返回所有实体列表的findAll()方法替换getTotalCount,或者使用count()方法更简单。然后,可以使用findAll(Pageable pageable)检索带有分页的数据,您只需要将new PageRequest(criterias.getStart(), criterias.getLength())作为参数传递即可。排序选项也可以通过Sort类在Spring Data中使用,它与Dandelion、DatatablesCriterias和ColumnDef类配合使用得非常好。对于更复杂的查询,可以使用@Query和@Param注释。因此,有关spring数据的更具体信息,最好是提出新的问题。
https://stackoverflow.com/questions/30363646
复制相似问题