2017-05-09 9 views
6

以下のコードはデモ用です。Spring JPA - EmbeddedIdで検索部分的に

マイエンティティ 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 
} 

私がいることをEmbeddedIdにより従業員を見つけることJPARepositoryインターフェイスメソッドを書くことができます私も結果を返します。

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

質問: と仮定、照会私はbranchNameをEMPLOYEEIDしている、と私はでdepartmentName

  • にフィルタをかけたくないしながら、そのような場合、私は自分のリポジトリメソッドを書く方法を教えてください
  • JPAにはこのようなシナリオで何かが組み込まれていますか?
+0

http://stackoverflow.com/questions/28020699/how-to-query-on-subsetコンポジットプライマリキー – Zeromus

+0

@Zeromusリンクをありがとう。しかし、私はリポジトリの実装を書くことに賛成ではありません。私は質問に対処するための組み込み機能を利用できるかどうか疑問に思っています –

答えて

4

を動作するはずです、それは私のために働いた方法です。

@ケトロックスの答えは正解であり、正常です。しかし、私の実際のシナリオでは、私は6つのフィールドを検索し、その結果、120文字以上の長いメソッド名が得られました。 codenarcを不幸にするために読んで、十分以上に確かに十分ではありません(以下のような何か)

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)); 
2
List<Employee> findByEmployeeKeyEmployeeIdAndEmployeeKeyDepartmentName(int Id,String name); 

ここHave a look at query derivation

+0

答えをありがとう。私は試してみて、それが私のために働くかどうかをお知らせします –

+0

あなたは答えが正しいです。できます。しかし、フィールドで6件の検索がある私のシナリオでは、メソッド名は地獄のように成長します。私はそれから私が答えとしてここに投稿した別の解決策を見つけ出して使用しました。 –

関連する問題