Spring Data JPA:从不同的表创建规范子查询
Spring Data JPA: Creating Specification Subquery from different tables
我正在尝试构建一个规范来为以下查询谓词子查询。
Select u.* 来自用户 u where u.login in (select ur.role_id from userRoles ur where ur.role_Id = roleId).
到目前为止这是我构建的部分
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);
}
};
}
你能帮我 link 主查询的子查询吗?
注意:实体 类 中没有定义连接。一切都应该只通过子查询来完成
找到答案
第一个谓词将加入 UserRole userId 列和 User table 登录列。
第二个谓词将根据 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);
}
};
}
我正在尝试构建一个规范来为以下查询谓词子查询。 Select u.* 来自用户 u where u.login in (select ur.role_id from userRoles ur where ur.role_Id = roleId).
到目前为止这是我构建的部分
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);
}
};
}
你能帮我 link 主查询的子查询吗?
注意:实体 类 中没有定义连接。一切都应该只通过子查询来完成
找到答案
第一个谓词将加入 UserRole userId 列和 User table 登录列。 第二个谓词将根据 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);
}
};
}