2017-05-25 25 views
0

以下の問合せに対して述語副問合せを作成しようとしています。 u。*をユーザーuから選択します(ここでは、ur.role_Id = roleIdのuserRoles urからur.role_idを選択します)。今、この時までSpring Data JPA:異なるテーブルから仕様副問合せを作成する

は、私はあなたがメインクエリでサブクエリをリンクするために私を助けてくださいすることができ

public static Specification<User> userRoleId(String roleId) { 
     return new Specification<User>() { 
      @Override 
      public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) { 
       //return builder.equal(root.<LocalDate> get("scheduledDisbursementDate"), scheduledDisbursementDate); 
       Subquery<UserRole> subquery = query.subquery(UserRole.class); 
       Root<UserRole> subqueryRoot = subquery.from(UserRole.class); 
       subquery.select(subqueryRoot); 
       Predicate roleIdList = builder.equal(subqueryRoot.get("roleId"), roleId); 
       subquery.select(subqueryRoot).where(roleIdList); 
       return builder.exists(subquery); 
      } 
     }; 
    } 

を構築している部分です。

注:Entityクラスには結合が定義されていません。 evrythingがsubquerysを介して行われるべき唯一の

答えて

0

見つかり回答

最初の述語はとのUserRoleのuserId列とユーザーテーブルのログイン欄に参加します。 2番目の述語は、roleIdに基づいて条件をフィルタリングします。

public static Specification<User> userRoleId(String roleId) { 
    return new Specification<User>() { 
     @Override 
     public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) { 
      Subquery<UserRole> subquery = query.subquery(UserRole.class); 
      Root<UserRole> subqueryRoot = subquery.from(UserRole.class); 
      subquery.select(subqueryRoot); 
      Predicate userIdPredicate = builder.equal(subqueryRoot.get("userId"), root.<String> get("login")); 
      Predicate rolePredicate = builder.equal(subqueryRoot.get("roleId"), roleId); 
      subquery.select(subqueryRoot).where(userIdPredicate, rolePredicate); 
      return builder.exists(subquery); 

     } 
    }; 
} 
関連する問題