Spring JPA - 按 EmbeddedId 部分查找

2022-09-01 08:56:33

以下代码仅用于演示目的。

我的实体豆看起来像这样

@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接口方法,通过嵌入式Id查找员工,该Id也将返回我的结果。

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

问题:假设在查询时,我只有 employeeIdbranchName,我不想在 DepartmentName 上放置过滤器

  • 在这种情况下,我如何编写我的存储库方法
  • JPA 是否为这种情况内置了一些东西?

答案 1
List<Employee> findByEmployeeKeyEmployeeIdAndEmployeeKeyBranchName(
        int employId,
        String branchName);

应该工作 看看查询派生


答案 2

以下是它如何为我工作。

@Ketrox的答案绝对正确,工作正常。但是在我的真实场景中,我有6个字段可以搜索,这导致了一个120多个字符的长度的方法名称。(如下所示)

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

这当然不足以阅读,也不足以使codenarc不高兴。


最后,我用例子找到,结果发现这是一个非常愉快的解决方案。

存储 库:

//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部分发现


推荐