Generics Spring JPA存储库使用Dandelion DatatableCriterias进行通用查找
我找到了关于如何实现ajax服务器端处理的示例。在控制器上,代码如下所示Generics Spring JPA存储库使用Dandelion DatatableCriterias进行通用查找,generics,jpa,jquery-datatables,dao,dandelion,Generics,Jpa,Jquery Datatables,Dao,Dandelion,我找到了关于如何实现ajax服务器端处理的示例。在控制器上,代码如下所示 @RequestMapping(value = "/persons") public @ResponseBody DatatablesResponse<Person> findAllForDataTablesFullSpring(@DatatablesParams DatatablesCriterias criterias) { DataSet<Person> dataSet = perso
@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插件的人来说都是一个很大的帮助。因为,最近我也做过类似的工作,我可以给出一些建议。 首先,您肯定应该了解一下,因为Spring框架的这一部分为您提供了数据库访问级别所需的一切。 您需要创建一个扩展JpaRepository的@Repository,然后从这里查询您的数据库。 例如,可以用findAll方法替换getTotalCount,findAll方法返回所有实体的列表,或者更简单的,使用count方法。 然后,可以使用findAllPageable pageable检索分页数据,您只需要将新的PageRequestcriterias.getStart、criterias.getLength作为参数传递。 在Spring数据中,通过Sort类也可以使用排序选项,它与Dandelion DataTablesCriteria和ColumnDef类配合使用非常好。 对于更复杂的查询,可以使用@Query和@Param注释。
因此,有关spring数据的更多具体信息,最好提出新问题。在使用spring MVC时,您是否考虑过使用spring数据模块。这样就不需要围绕常见的CRUD操作编写大量的boiler plate代码,并支持即时分页等。