2017-05-25 65 views
0

我想建立一個規範來判斷下面查詢的子查詢。 從用戶u中選擇u。*,其中u.login in(從userRoles中選擇ur.role_id,其中ur.role_Id = roleId)。春季數據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); 
      } 
     }; 
    } 

能否請您幫我出的子查詢與主查詢鏈接部分。

注意:在實體類中沒有定義聯接。 evrything應通過subquerys做只

回答

0

找到答案

第一斷言將加入UserRole的用戶id柱和用戶表登錄列。 第二個謂詞將根據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); 

     } 
    }; 
}