2017-05-09 20 views
6

Poniższy kod służy wyłącznie celom demonstracyjnym.Wiosenny WZP - Znajdź według Osadzonego częściowo

Moja Podmiot fasola wygląda to

@Entity 
class Employee { 

    @EmbeddedId 
    private EmployeeKey employeeKey; 

    private String firstName; 
    private String lastName; 

    // Other fields 
    // Getter and Setters 
} 

The osadzania Klasa:

@Embeddable 
class EmployeeKey implements Serializable { 

    private int employeeId; 
    private String branchName; 
    private String departmentName; 

    //Getter and Setters 
} 

mogę napisać JPARepository metody interfejsu znaleźć pracowników przez EmbeddedId że również zwraca wyniki.

interface EmployeeRepository extends JpaRepository<Employee, EmployeeKey> { 
     List<Employee> findByEmployeeKey(EmployeeKey employeeKey); 
} 

Pytanie: Załóżmy, podczas odpytywania mam IDpracownika i BRANCHNAME tylko, i nie chcę, aby umieścić filtr na departmentName

  • W w takich przypadkach jak mogę napisać moją metodę Repozytorium
  • Czy WZP ma coś wbudowanego w taki scenariusz?
+0

http://stackoverflow.com/questions/28020699/how-to-query-on-subset -of-composite-primary-key – Zeromus

+0

@Zeromus Dzięki za link. Jednak nie jestem zwolennikiem pisania implementacji repozytorium. Zastanawiam się, czy mogę skorzystać z wbudowanej funkcjonalności, aby odpowiedzieć na pytanie: –

Odpowiedz

4

Oto jak to działa na mnie.

@ Odpowiedź Ketrox jest absolutnie poprawna i działa dobrze. Ale w moim prawdziwym scenariuszu miałem 6 pól do wyszukania i co zaowocowało nazwą metody o długości ponad 120 znaków. (Coś poniżej)

List<Employee> findByEmployeeKeyField1AndEmployeeKeyField2AndEmployeeKeyField3AndEmployeeKeyField4AndEmployeeKeyField5AndEmployeeKeyField6(String field1, String field2, String field3, String field4, String field5, String field6); 

co z pewnością nie jest wystarczająco dobry, aby przeczytać więcej niż wystarczająco dobre, aby codenarc nieszczęśliwy.


Wreszcie znalazłem przykład i okazało się to bardzo przyjemnym rozwiązaniem.

Repozytorium:

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

Zastosowanie:

// 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)); 
2
List<Employee> findByEmployeeKeyEmployeeIdAndEmployeeKeyDepartmentName(int Id,String name); 

Powinna działać Have a look at query derivation

+0

Dzięki za odpowiedź. Spróbuję i dam ci znać, jeśli to mi pomoże –

+0

Twoja odpowiedź jest poprawna. To działa.Ale w moim scenariuszu, w którym mam 6 wyszukiwań według pól, nazwa metody rośnie jak diabli. Następnie znalazłem i użyłem innego rozwiązania, które zamieściłem tutaj jako odpowiedź. –