2017-08-03 2 views
3

Ich möchte eine Tabelle von Personen zeigen. Der Benutzer sollte in der Lage sein, Abfragen zu senden und nach Attributen zu filtern, die meist optional sind.Wie verwende ich CrudRepository mit Variationen von Parametern?

Problem: für jedes Attribut zu filtern, ich würde eine zusätzliche Methode in spring-data-jpa mit `CrudRepository vorstellen:

public interface PersonRepository extends CrudRepository<Person, Long> { 
    List<Person> findByFirstname(firstname); 
    List<Person> findbyFirstnameAndLastname(first, last); 
    List<Person> findByFirstnameAndLastnameAndAge(first, last, age); 
    List<Person> findByFirstnameAndLastnameAndAgeAndCity(first, last, age, city); 
} 

Frage: Wie könnte ich besser machen (ohne nativen PreparedStatement s schreiben mich selber)?

+1

Diese https helfen kann: // Frühling. io/blog/2011/04/26/advanced-spring-daten-jpa-spezifikationen-und-querydsl/ –

+0

Als Variante: https://stackoverflow.com/a/43229441 – Cepr0

Antwort

1

Query by example ermöglicht Filter durch Bestücken einfachen Filterkriterien in ein "Beispiel" Unternehmen zu schaffen:

public interface PersonRepository extends CrudRepository<Person, Long> { 
    <S extends T> Iterable<S> findAll(Example<S> example); 
} 

... 

Person person = new Person(); 
person.setFirstname("Dave"); 
person.setCity("Seattle"); 
Iterable<Person> davesFromSeattle = personRepository.findAll(Example.of(person)); 
+0

Nun, aber wie würden Sie dann Abfragen wie "byFirstnameIgnoreCase" oder "byAgeGreaterThan" erstellen? – membersound

+1

Für 'ignored-case',' like', 'starts-with',' ends-with' können Sie * ExampleMather * verwenden. https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.execution –

+1

Für numerische Bereiche können Sie komplexere (aber leistungsfähigere) 'Specification' ausprobieren Ansatz. https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications –

-1

Sie können eine HashMap verwenden. Die Schlüssel und Werte werden später verwendet, um Ihre Aussage zu erstellen. Oder Sie können ein Builder-Muster verwenden. Sie können das verwenden, um dynamische Abfragen zu erstellen.

0

verwenden Sie Paginierung und Stream-Abfragen für Teig Ergebnismenge Anforderung Einheit

0

Sie müssen nur Ihre gewünschten Eigenschaften auf Einheit gesetzt und es Methode findAll (Entity entity)

zum Beispiel passieren, wenn Sie Mitarbeiter mit einer Eigenschaft Wert wollen dann setze die Parameter darauf und passiere die Datenbank abfragen.

Employee employee = new Employee(); 
employee. setAge (35); 
employee. setExperience(5); 

geben es nun für die Suche nach

List <Employee> employèes = do. findAll (Employee); 
+0

Funktioniert das wirklich? Suche nach einer '@ Entity' Bean? – membersound

Verwandte Themen