web-dev-qa-db-ja.com

Spring JPA-EmbeddedIdで部分的に検索

以下のコードはデモ専用です。

MyEntityBeanは次のようになります

@Entity
class Employee {

    @EmbeddedId
    private EmployeeKey employeeKey;

    private String firstName;
    private String lastName;

    // Other fields
    // Getter and Setters
}

Embeddableクラス:

@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にフィルターを配置する

  • そのような場合、Repositoryメソッドをどのように書くことができますか
  • JPAには、このようなシナリオ用のビルドがありますか?
20
Amit Phaltankar

これが私にとっての仕組みです。

@Ketroxの答えは完全に正しいものであり、正常に機能します。しかし、実際のシナリオでは、検索するフィールドが6つあり、メソッド名は120文字以上になりました。 (以下のようなもの

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

これは確かに読むのに十分ではなく、 codenarc 不幸にするほど十分ではありません。


最後に、find by exampleを使用しましたが、これは本当に快適なソリューションであることがわかりました。

リポジトリ:

//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によって部分的に検索 で検索を詳しく説明しました

7
Amit Phaltankar
List<Employee> findByEmployeeKeyEmployeeIdAndEmployeeKeyDepartmentName(int Id,String name);

動作するはずです クエリの派生を見てください

14
ketrox