Spring Data JPA:从不同的表创建规范子查询

Nag*_*ava 1 spring hibernate-criteria spring-data-jpa

我正在尝试构建规范来为以下查询谓词子查询。选择 u.* from User u where u.login in(选择 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);
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

你能帮我把子查询与主查询联系起来吗?

注意:实体类中没有定义连接。一切都应该只通过子查询来完成

Nag*_*ava 5

找到答案

第一个谓词将 UserRole userId 列与 User 表登录列连接起来。第二个谓词将根据 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);

        }
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么代码中有两次“subquery.select(subqueryRoot);”?第一个不是多余的吗? (2认同)