Spring JPA - Поиск по EmbeddedId частично

Ниже код предназначен только для демонстрационной цели.

My Entity bean выглядит следующим образом

@Entity
class Employee {

    @EmbeddedId
    private EmployeeKey employeeKey;

    private String firstName;
    private String lastName;

    // Other fields
    // Getter and Setters
}

Встраиваемый класс:

@Embeddable
class EmployeeKey implements Serializable {

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

    //Getter and Setters
}

Я могу написать метод интерфейса JPARepository, чтобы найти Employees с помощью EmbeddedId, который также возвращает мне результаты.

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

Вопрос: Предположим, что при запросе у меня есть только employeeId и branchName, и я не хочу помещать фильтр в departmentName

  • В таких случаях, как я могу написать метод репозитория
  • Есть ли у JPA что-то встроенное для такого сценария?

Ответ 1

Вот как это работает для меня.

@Ketrox ответ абсолютно правильный и работает нормально. Но в моем реальном сценарии у меня было 6 полей для поиска, что привело к длинному имени метода 120+. (Что-то вроде ниже)

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

Что, конечно, недостаточно хорошо для чтения и более чем достаточно, чтобы сделать коденарк несчастным.


В конце концов я использовал find by example, и это оказалось действительно приятным решением.

Repository:

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

Использование:

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

Я разработал поиск по Spring Data JPA найти по @EmbeddedId Частично