web-dev-qa-db-fra.com

Spring JPA - Find By EmbeddedId partiellement

Le code ci-dessous est uniquement destiné à la démonstration.

Mon bean entité ressemble à ceci

@Entity
class Employee {

    @EmbeddedId
    private EmployeeKey employeeKey;

    private String firstName;
    private String lastName;

    // Other fields
    // Getter and Setters
}

La classe embarquable :

@Embeddable
class EmployeeKey implements Serializable {

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

    //Getter and Setters
}

Je peux écrire la méthode d'interface JPARepository pour trouver des employés par EmbeddedId qui me renvoie également les résultats.

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

Question: Supposons que, lors de la requête, j'ai employeeId et branchName seulement, et je ne veux pas mettre de filtre sur departmentName

  • Dans de tels cas, comment puis-je écrire ma méthode de référentiel
  • JPA a-t-il quelque chose en construction pour ce scénario?
20
Amit Phaltankar

Voici comment cela a fonctionné pour moi.

La réponse de @ Ketrox est absolument correcte et fonctionne très bien. Mais dans mon scénario réel, j'avais 6 champs à rechercher et qui ont abouti à un nom de méthode de plus de 120 caractères. ( Quelque chose comme ci-dessous)

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

Ce qui n'est certainement pas assez bon à lire et plus que suffisant pour rendre codenarc malheureux.


Enfin, j'ai utilisé find par exemple et cela s'est avéré être une solution vraiment agréable.

Référentiel:

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

Utilisation:

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

J'ai élaboré la recherche par Spring Data JPA find by @EmbeddedId Partially

7
Amit Phaltankar
List<Employee> findByEmployeeKeyEmployeeIdAndEmployeeKeyDepartmentName(int Id,String name);

Devrait fonctionner Jetez un œil à la dérivation des requêtes

14
ketrox