2017-05-18 5 views
0

Ich weiß, dass ich benutzerdefinierte Abfragen erstellen kann, indem ich eine Methode zu meiner Repository-Schnittstelle hinzufügen. Zum Beispiel, wenn ich die Entität Person habe.Spring Data JPA findBy optionale Variablen

@Entity 
public class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    private String firstName; 
    private String lastName; 
    private String gender; 
    private String dateOfBirth; 

    // All applicable getters and setters 
} 

Meine Repository-Schnittstelle kann wie folgt aussehen:

@RepositoryRestResource(collectionResourceRel = "people", path = "people") 
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> { 

    List<Person> findByLastName(@Param("name") String name); 

} 

Aber was, wenn ich will für alle Parameter und alle Kombination von Parametern suchen. Zum Beispiel, wenn ich von suchen:

  • Vornamen (selbst)
  • Namen (von selbst)
  • Geschlecht (von selbst)
  • dateOfBirth (selbst)
  • Vornamen und Nachnamen
  • vorName und Geschlecht
  • vorName und dateOfBirth
  • nachName und Geschlecht
  • nachName und dateOfBirth
  • Geschlecht und dateOfBirth
  • Vorname und Nachname und Geschlecht
  • Vorname und Nachname und dateOfBirth
  • Vorname und Nachname und dateOfBirth und Geschlecht

Heißt das, ich muss Erstellen Sie alle diese Repository-Methoden in der Schnittstelle. Gibt es eine Möglichkeit, nach allen Parametern zu suchen. Etwas nach dem Vorbild von

findBy(String firstName, String lastName, String gender, String dateOfBirth) 

und wenn, was verbraucht den REST-API zum Beispiel nur auf Vornamen suchen möchte und Nachnamen wäre es

http://localhost/people/search/findBy?firstName=John&firstName=Smith 

UPDATE nennen: Ich war in der Lage zu lösen Dies, mit einigen SQL-Trickserei In der PersonRepository-Schnittstelle habe ich etwas wie folgt gemacht:

Der Endpunkt wird Th genannt http://localhost:8080/people/search/findBy?firstName=John&lastname=&gender=&dateOfBirth= ist Weg

Sie eine Liste aller Menschen „John“

Antwort

1

Nutzen Sie finden mit gutem Beispiel genannt bekommen sollte. Ich habe es für Mitarbeiter getan.

Repository:

//skipped lines  
import org.springframework.data.domain.Example 
//skipped lines 
interface EmployeeRepository extends JpaRepository<Employee, EmployeeKey>{ 
    List<Employee> findAll(Example<Employee> employee); 
} 

Verbrauch:

// Prepare Employee key with all available search by keys (6 in my case) 
EmplyeeKey key = new EmplyeeKey(); 
key.setField1("field1_value"); 
key.setField2("field2_value"); 
//Setting remaining 4 fields 

// Create new Employee ans set the search key 
Employee employee = new Employee(); 
employee.setEmployeeKey(key); 


// Call the findAll by passing an Example of above Employee object 
List<Employee> result = employeeRepository.findAll(Example.of(employee));