Java Spring JPA-通过EmbeddedId部分查找

Java Spring JPA-通过EmbeddedId部分查找,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,下面的代码仅用于演示目的 我的实体bean看起来像这样 @Entity class Employee { @EmbeddedId private EmployeeKey employeeKey; private String firstName; private String lastName; // Other fields // Getter and Setters } 可嵌入类: 我可以编写JPARepository接口方法,通过E

下面的代码仅用于演示目的

我的实体bean看起来像这样

@Entity
class Employee {

    @EmbeddedId
    private EmployeeKey employeeKey;

    private String firstName;
    private String lastName;

    // Other fields
    // Getter and Setters
}
可嵌入类:


我可以编写JPARepository接口方法,通过EmbeddedId查找员工,该ID也会返回结果

interface EmployeeRepository extends JpaRepository<Employee, EmployeeKey> {
        List<Employee> findByEmployeeKey(EmployeeKey employeeKey);
}
interface EmployeeRepository扩展了JpaRepository{
列表FindByeEmployeeKey(EmployeeKey EmployeeKey);
}

问题: 假设,在查询时,我只有employeeId和branchName,并且我不想在departmentName上设置过滤器

  • 在这种情况下,如何编写存储库方法
  • JPA是否有针对这种场景的构建
列出FindByEmployeeKeyEmployeeId和EmployeeKeyDepartmentName(int-Id,字符串名称);

应该行得通

以下是它对我的作用

@凯特罗克斯的回答绝对正确,效果很好。但在我的真实场景中,我有6个字段要搜索,这导致了一个120多个字符长的方法名。(如下图所示)

列出查找到的员工关键字字段1、员工关键字字段2、员工关键字字段3、员工关键字字段4、员工关键字字段5和员工关键字字段6(字符串字段1、字符串字段2、字符串字段3、字符串字段4、字符串字段5、字符串字段6);
这当然不足以让人阅读,也不足以让人不高兴


最后,我使用了find by example,结果证明这是一个非常令人愉快的解决方案

存储库:

//跳过的行
导入org.springframework.data.domain.Example
//跳过的行
接口EmployeeRepository扩展了JpaRepository{
列出findAll(示例员工);
}
用法:

//使用所有可用的按键搜索准备员工密钥(在我的示例中为6)
employeekey=新employeekey();
键。设置字段1(“字段1_值”);
key.setField2(“field2_值”);
//设置剩余的4个字段
//创建新员工并设置搜索键
员工=新员工();
employee.setEmployeeKey(key);
//通过传递上述Employee对象的示例来调用findAll
列表结果=employeeRepository.findAll(例如(employee));

我已经详细介绍了Zeromus的搜索,谢谢你的链接。但是,我不赞成编写存储库实现。我想知道我是否可以利用内置的功能来回答这个问题谢谢你的回答。我会试一试,让你知道,如果你的答案是正确的。它起作用了。但在我的场景中,我有6个按字段搜索的方法,方法名增长得非常快。然后我找到并使用了另一个解决方案,我在这里发布了一个答案。
interface EmployeeRepository extends JpaRepository<Employee, EmployeeKey> {
        List<Employee> findByEmployeeKey(EmployeeKey employeeKey);
}
List<Employee> findByEmployeeKeyEmployeeIdAndEmployeeKeyDepartmentName(int Id,String name);
List<Employee> findByEmployeeKeyField1AndEmployeeKeyField2AndEmployeeKeyField3AndEmployeeKeyField4AndEmployeeKeyField5AndEmployeeKeyField6(String field1, String field2, String field3, String field4, String field5, String field6);
//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));