【问题标题】:Spring JPA Repositories Generic FIND WITH Dandelion DatatableCriteriasSpring JPA Repositories Generic FIND WITH Dandelion DatatableCriterias
【发布时间】:2015-05-21 02:40:15
【问题描述】:

我找到了有关如何实现 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();
}

我的问题是我需要重复编码数据访问层,这对于我的所有实体都是完全相同的。现在,我想有一个通用的实现。有人可以给我解决这个问题。对于任何使用蒲公英数据表插件的人来说,这将是一个很大的帮助。

【问题讨论】:

标签: generics jpa jquery-datatables dao dandelion


【解决方案1】:

由于最近我在做同样的任务,我可以给一些建议。 首先,您绝对应该看一下Spring Data,因为 Spring 框架的那部分为您提供了数据库访问级别所需的一切。 您需要创建一个扩展JpaRepository@Repository,然后从这里查询您的数据库。 因此,例如,getTotalCount 可以替换为findAll() 方法,该方法返回所有实体的列表,或者更简单,使用count() 方法。 然后,可以使用findAll(Pageable pageable) 检索带有分页的数据,您只需将new PageRequest(criterias.getStart(), criterias.getLength()) 作为参数传递。 排序选项也可以通过 Sort 类在 Spring Data 中使用,它与 Dandelion DatatablesCriterias 和 ColumnDef 类一起工作得非常整洁。 对于更复杂的查询,您可以使用 @Query@Param 注释。 因此,有关 Spring 数据的更具体信息,最好提出新问题。

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 2017-05-06
    • 2014-11-27
    • 2022-12-26
    • 2014-11-14
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多