Spring JPA - 部分查找EmbeddedId [英] Spring JPA - Find By EmbeddedId partially
问题描述
My Entity bean看起来像这样
@Entity
类员工{
@EmbeddedId
私人EmployeeKey employeeKey;
private String firstName;
private String lastName;
//其他字段
// Getter和Setters
}
可嵌入的类:
@Embeddable
类EmployeeKey实现了Serializable {
private int employeeId;
private String branchName;
private String departmentName;
// Getter and Setters
}
我可以编写 JPARepository 接口方法来查找EmbeddedId的Employees,它也返回结果。
接口EmployeeRepository扩展了JpaRepository< Employee,EmployeeKey> {
列表<员工> findByEmployeeKey(EmployeeKey employeeKey);
b
$ b 问题:
假设,在查询我只有 employeeId 和 branchName 时,我不想将过滤器放在 departmentName
- 在这种情况下,我如何编写我的Repository方法
- 为这种情况构建?
@Ketrox的回答是绝对正确的,并且工作正常。但在我真实的情况下,我有6个字段进行搜索,并导致120+字符长的方法名称。 ( )
列表< Employee> findByEmployeeKeyField1AndEmployeeKeyField2AndEmployeeKeyField3AndEmployeeKeyField4AndEmployeeKeyField5AndEmployeeKeyField6(String field1,String field2,String field3,String field4,String field5,String field6);
这当然不够好,不足以使 codenarc 不高兴。
最后,我用例子找到了这个结果,真是令人愉快的解决方案。
储存库:
//跳过行
import org.springframework.data.domain.Example
//跳过的行
接口EmployeeRepository扩展JpaRepository< Employee,EmployeeKey> {
List< Employee> findAll(示例<员工>员工);
}
用法:
//准备所有可用键搜索的Employee键(在我的例子中为6)
EmplyeeKey键= new EmplyeeKey ();
key.setField1(field1_value);
key.setField2(field2_value);
//设置剩余的4个字段
//创建新员工并设置搜索关键字
Employee employee = new Employee();
employee.setEmployeeKey(key);
//通过传递上述Employee对象的示例来调用findAll
List< Employee> result = employeeRepository.findAll(Example.of(employee));
Below code is for demo purpose only.
My Entity bean looks like this
@Entity
class Employee {
@EmbeddedId
private EmployeeKey employeeKey;
private String firstName;
private String lastName;
// Other fields
// Getter and Setters
}
The Embeddable class:
@Embeddable
class EmployeeKey implements Serializable {
private int employeeId;
private String branchName;
private String departmentName;
//Getter and Setters
}
I can write JPARepository interface method to find Employees by the EmbeddedId that returns me results as well.
interface EmployeeRepository extends JpaRepository<Employee, EmployeeKey> {
List<Employee> findByEmployeeKey(EmployeeKey employeeKey);
}
Question: Suppose, while querying I have employeeId and branchName only, and I don't want to put filter on departmentName
- In such cases how can I write my Repository method
- Does JPA have something in-build for such scenario?
Here is how it worked for me.
@Ketrox's answer is absolutely correct and works fine. But in my real scenario I had 6 fields to search by and which resulted in an 120+ characters long method name. (Something like below)
List<Employee> findByEmployeeKeyField1AndEmployeeKeyField2AndEmployeeKeyField3AndEmployeeKeyField4AndEmployeeKeyField5AndEmployeeKeyField6(String field1, String field2, String field3, String field4, String field5, String field6);
Which is certainly not good enough to read and more than good enough to make codenarc unhappy.
Finally I used find by example and that turned out to be really pleasant solution.
Repository:
//skipped lines
import org.springframework.data.domain.Example
//skipped lines
interface EmployeeRepository extends JpaRepository<Employee, EmployeeKey>{
List<Employee> findAll(Example<Employee> employee);
}
Usage:
// 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 JPA - 部分查找EmbeddedId的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!