2013-04-03 8 views
6

Come si può eseguire l'ordinamento senza distinzione tra maiuscole e minuscole utilizzando la funzione di raccolta dati Spring?ordinamento senza distinzione tra maiuscole e minuscole utilizzando i dati della molla

ho questo metodo nella mia Repository

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

Voglio essere in grado di chiamare quello con:

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

Nota la funzione lower nella stringa di proprietà. Ciò non funziona in quanto Spring-data si aspetta una proprietà lì. Che otterranno tradotto in qualcosa di simile:

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

che ovviamente non funziona in quanto non v'è alcuna proprietà 'inferiore' sull'oggetto.

C'è un modo per farlo funzionare?

risposta

12

Sort.Order.ignoreCase() era introdurre circa 8 mesi fa in primavera-dati-JPA, guarda qui:

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

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

Una volta che si dispone di una versione appropriata di primavera-dati-APP (credo dalla 1.4 M1, ho 1.4.1) puoi scrivere qualcosa come:

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

Sì, è così che ho fatto alla fine. Al momento c'era un bug con questa opzione. Sono io che sto segnalando che c'è qualcosa di fisso :) – Stef

0

Di seguito è riportato Codice che userei per fare per l'ordinamento:

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

Questo è come si fa nei dati di primavera

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

Dopo che si otterrà BasicDBObjects nativi di cui avete bisogno per trasformare nel dominio. Questo codice è disordinato se hai bisogno di aiuto per informare.

+0

come sono i dati primaverili? – Stef

+0

@Stef Vuoi che l'impaginazione con l'ordinamento ignori il caso e i filtri? – AbdusSalam

+0

Ecco come si fa in primavera – AbdusSalam

Problemi correlati