2015-05-21 4 views
0

Я нашел образцы о том, как реализовать обработку на стороне сервера ajax. На контроллере код выглядит так.Spring JPA Repositories Generic НАЙТИ С Dandelion DatatableCriterias

@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(); 
} 

Моя проблема с этим мне нужно повторить кодирование слой доступа к данным, который полностью одинаков для все мои сущности. Теперь я думаю о том, что у меня есть реализация GENERIC. Может кто-то дать мне решение для этого. Это было бы большой помощью для тех, кто использует плагин Dandelion Datatables.

+0

Как вы используете Spring MVC, рассмотрели ли вы использование модуля Spring Data. Это устраняет необходимость записи большого количества кода котельной плиты вокруг обычных операций CRUD и поддержки пейджинга и т. Д. Из коробки. http://docs.spring.io/spring-data/jpa/docs/1.8.0.RELEASE/reference/html/ –

ответ

0

С тех пор, как я работал над тем же самым заданием, я могу дать пару предложений. Прежде всего, вы должны обязательно взглянуть на Spring Data, поскольку эта часть Spring Framework предоставляет вам все, что вам нужно для уровня доступа к базе данных. Вам нужно будет создать @Repository, который расширяет JpaRepository, а затем отсюда запрашивает вашу базу данных. Так, например, getTotalCount может быть заменен на метод findAll(), который возвращает список всех сущностей или даже проще с помощью метода count(). Затем данные с разбивкой по страницам можно получить с помощью findAll(Pageable pageable), где вам нужно просто указать new PageRequest(criterias.getStart(), criterias.getLength()). Опция сортировки также доступна в Spring Data через класс Sort, и она работает довольно аккуратно с Dandelion DatatablesCriterias и ColumnDef. Для более сложных запросов вы можете использовать аннотации @Query и @Param. Итак, для более подробной информации о весенних данных лучше задавать новые вопросы.

Смежные вопросы