2013-04-03 25 views
6

Jak mogę zrobić sortowanie bez rozróżniania wielkości liter przy użyciu danych sprężynowych Pageable?sortowanie niewrażliwe na wielkość liter przy użyciu danych sprężystych

mam tę metodę w moim repozytorium

public interface ItemRepository extends QueryDslPredicateExecutor<Item>{ 
    @Query("SELECT o FROM Item o WHERE o.status = ?1") 
    Page<Item> findByStatus(Item.Status status, Pageable pageable); 
} 

Chcę, aby móc nazwać się:

itemRepository.findByStatus(Status.completed, new PageRequest(0, 10, Direction.ASC, "lower(name)") 

Uwaga Funkcja w ciągu własności lower. To nie działa, ponieważ Spring-data oczekuje tam nieruchomości. Zostanie to przetłumaczone na coś takiego:

SELECT o FROM Item o WHERE o.status = ?1 ORDER BY o.lower(name) 

co oczywiście nie zadziała, ponieważ na obiekcie nie ma "niższych" właściwości.

Czy istnieje sposób, aby to zadziałało?

Odpowiedz

12

Sort.Order.ignoreCase() było wprowadzenie około 8 miesięcy temu do wiosny-data-WZP, spójrz tutaj:

https://jira.springsource.org/browse/DATAJPA-296

https://github.com/kraymondksc/spring-data-jpa/commit/c3adce0bd36799d3754a5f4c61aee64982abd7e0

Gdy masz odpowiednią wersję wiosny-data-WZP (myślę od 1.4 M1, mam 1.4.1) możesz napisać coś takiego:

Sort.Order order = new Sort.Order(Sort.Direction.ASC, "name").ignoreCase(); 
itemRepository.findByStatus(Status.completed, new PageRequest(0, 10, new Sort(order)); 
+0

Tak, w końcu to zrobiłem. W tym czasie wystąpił błąd z tą opcją. To ja relacjonuję, że trzeba to naprawić :) – Stef

0

Poniżej znajduje się lista Kod użyłbym zrobić, aby Sortowanie:

db.getCollection('employee').aggregate([ 
    { 
    $project: { 
     fieldToSortWith: { $toLower: "$lastName" }, 
     subject: 1 
      } 
}, 
{ 
    $sort: { fieldToSortWith: 1 }, 
} 
]) 

W ten sposób można zrobić to w danych wiosennych

DBCollection coll = mongoTemplate.getCollection("employee"); 
     List<DBObject> pipe = new ArrayList<>(); 
     DBObject prjflds = new BasicDBObject(); 
     prjflds.put("id", 1); 
     prjflds.put("firstName", 2); 
     prjflds.put("lastName", new BasicDBObject("$toLower", "$lastName")); 
     DBObject project = new BasicDBObject(); 
     project.put("$project", prjflds); 
     pipe.add(project); 
     DBObject sort = new BasicDBObject(); 
     sort.put("$sort", new BasicDBObject("lastName", 1)); 
     pipe.add(sort); 
     BasicDBObject skip = new BasicDBObject("$skip", searchCriteria.getCurrentPage() * searchCriteria.getPageSize()); 
     BasicDBObject limit = new BasicDBObject("$limit", searchCriteria.getPageSize()); 
     pipe.add(skip); 
     pipe.add(limit); 
     BasicDBObject employeeRoleFilter = new BasicDBObject("$match", new BasicDBObject("employeeRoles", new BasicDBObject("$in", searchCriteria.getEmployeeRolesNames()))); 
     pipe.add(employeeRoleFilter); 
     BasicDBObject employeeStatusFilter = new BasicDBObject("$match", new BasicDBObject("active", new BasicDBObject("$eq", Boolean.valueOf(searchCriteria.getEmployeeStatus())))); 
     pipe.add(employeeStatusFilter); 
     searchCriteria.isEmployeeNameSearchIndicator()); 
     pipe.add(searchTextFilter); 
     coll.aggregate(pipe).results(); 

Po tym dostaniesz rodzimych BasicDBObjects które trzeba przekształcić w swojej domenie. Ten kod jest nieczytelny, jeśli potrzebujesz pomocy.

+0

jak to jest dane z wiosny? – Stef

+0

@Stef Czy chcesz, aby paginacja była sortowana z pominięciem filtrów case anf? – AbdusSalam

+0

Tak to robisz na wiosnę – AbdusSalam

Powiązane problemy