一尘不染

Spring JPA-部分按EmbeddedId查找

hibernate

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

我的 实体 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 接口方法以通过EmbeddedId查找雇员,该方法也返回我的结果。

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

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

  • 在这种情况下,如何编写我的存储库方法
  • JPA是否有针对这种情况的内置功能?

阅读 291

收藏
2020-06-20

共1个答案

一尘不染

这就是它为我工作的方式。

@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查找)

2020-06-20