【问题标题】:Spring Data JPA: Creating Specification Subquery from different tablesSpring Data JPA:从不同的表创建规范子查询
【发布时间】:2017-10-25 14:57:14
【问题描述】:

我正在尝试为以下查询构建一个谓词子查询的规范。 Select u.* from User 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);
            }
        };
    }

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

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

【问题讨论】:

    标签: spring spring-data-jpa hibernate-criteria


    【解决方案1】:

    找到答案

    第一个谓词将连接 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);
    
            }
        };
    }
    

    【讨论】:

    • 为什么代码中有两次subquery.select(subqueryRoot);?第一个不是多余的吗?
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2014-05-18
    • 2017-03-14
    • 2016-07-22
    • 2014-08-04
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多