2017-12-18 20 views
0

私のエンティティクラスが春データJPA仕様:どのようにその子の親オブジェクトをフィルタ処理するオブジェクトプロパティ

@Entity 
@table 
public class User { 

    @OneToOne 
    private UserProfile userProfile; 

    // others 
} 


@Entity 
@Table 
public class UserProfile { 

    @OneToOne 
    private Country country; 
} 

@Entity 
@Table 
public class Country { 
    @OneToMany 
    private List<Region> regions; 
} 

以下の通りです今私は、特定の地域ですべてのユーザーを取得したいです。私はSQLを知っているが、私は春のデータJPA仕様でそれをしたい。リージョンはリストであり、単一の値と一致させようとしているので、以下のコードは機能しません。地域リストを取得して単一のオブジェクトと比較する方法

public static Specification<User> userFilterByRegion(String region){ 


     return new Specification<User>() { 
      @Override 
      public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { 

       return criteriaBuilder.equal(root.get("userProfile").get("country").get("regions").get("name"), regionalEntity); 
      } 
     }; 
    } 

編集:ありがとうございました。実際には、私は次のJPQLの同等のクエリを探しています

SELECT u FROM User u JOIN FETCH u.userProfile.country.regions ur WHERE ur.name=:<region_name> 

答えて

1

これを試してみてください。これはあなたが確信している場合あなたがいることを、私のコード

// string constants make maintenance easier if they are mentioned in several lines 
private static final String CONST_CLIENT = "client"; 
private static final String CONST_CLIENT_TYPE = "clientType"; 
private static final String CONST_ID = "id"; 
private static final String CONST_POST_OFFICE = "postOffice"; 
private static final String CONST_INDEX = "index"; 
... 

@Override 
public Predicate toPredicate(Root<Claim> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
    List<Predicate> predicates = new ArrayList<Predicate>(); 
    // we get list of clients and compare client's type 
    predicates.add(cb.equal(root 
       .<Client>get(CONST_CLIENT) 
       .<ClientType>get(CONST_CLIENT_TYPE) 
       .<Long>get(CONST_ID), clientTypeId)); 
    // Set<String> indexes = new HashSet<>(); 
    predicates.add(root 
       .<PostOffice>get(CONST_POST_OFFICE) 
       .<String>get(CONST_INDEX).in(indexes)); 
    // more predicates added 
    return return andTogether(predicates, cb); 
} 

private Predicate andTogether(List<Predicate> predicates, CriteriaBuilder cb) { 
    return cb.and(predicates.toArray(new Predicate[0])); 
} 

からリージョンクラス

+0

助けてくれてありがとうございますが、私の場合はうまくいきません。私は、jpa criteriaクエリーで以下を翻訳する必要があります。 FROMユーザーuからJOIN FETCHを実行u.userProfile.country.reg ur ur ur.name –

0

スニペットにEquals方法(また、ハッシュコード)をオーバーライドすることで平等のための条件を定義することができ

criteriaBuilder.isMember(regionalEntity, root.get("userProfile").get("country").get("regions")) 

を動作するはずです1つの述語しか必要としない場合、Listの使用は過度のものになる可能性があります。

関連する問題