Spring 数据 JPA : Creating Specification Subquery from different tables

标签 spring spring-data-jpa hibernate-criteria

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

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

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

最佳答案

找到答案

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

        }
    };
}

关于 Spring 数据 JPA : Creating Specification Subquery from different tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44172358/

相关文章:

java - 如何在实体中添加对象列表

java - 使用 Spring 和 JPA 的 RESTfull 用户 session

java - 如何在 JPA Criteria API 中投影单个列?

java - Spring Jersey POST 序列化 bean

javax.servlet.ServletException : Not running on Jetty, JSR-356 支持不可用

java - spring hibernate jpa中的多对一关系

java - 从具有 <String, Class> 属性 HashMaps 的 bean 注入(inject)类

spring-data-jpa - 在 @jsonformat 中设置 timezone = "Asia/Kolkata"并将其存储在 java.sql.timestamp 中将在 Spring Hibernate 中将中午 12 点转换为下午 1 点,timesatmp 转换为上午 00 点

java - 在 hibernate 中使用 Criteria api 如何使用投影实现延迟加载列表?

java - hibernate 一对多映射渴望获取不起作用