Spring JPA - 部分查找EmbeddedId [英] Spring JPA - Find By EmbeddedId partially

查看:531
本文介绍了Spring JPA - 部分查找EmbeddedId的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆