java - 带有 JPA 子查询的 Spring Data 规范

标签 java hibernate jpa spring-data-jpa

我想执行 Spring 数据规范中的子查询。它一定是这样的 SQL 语句:

select u from users u where u.name in (select up.username from users_profiles up where up.profile in ('admin'));

我有 3 个简单的表格:

  1. 存储用户数据的users
  2. 存储用户个人资料类型的个人资料
  3. users_profiles 用于存储用户和多个配置文件之间的关系

因此,有了配置文件列表,我需要找到拥有这些配置文件的所有用户。

public List<User> getUsersByProfileType(List<String> profileTypes) {
    return userRepository.findAll(new Specification<User> () {
        @Override
        public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            final List<Predicate> predicates = new ArrayList<>();

            /*
            userNamesWithMatchedProfiles = select up.username from users_profiles up where up.profile in profileTypes
            */
            List<String> userNamesWithMatchedProfiles = new ArrayList<String>();
            predicates.add(root.get("name").in(userNamesWithMatchedProfiles))
            return cb.and(predicates.toArray(new Predicate[predicates.size()])); 
        }
    });
}

最佳答案

我找到了执行子查询的方法:

public List<User> getUsersByProfileType(List<String> profileTypes) {
        return userRepository.findAll(new Specification<User> () {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                final List<Predicate> predicates = new ArrayList<>();

                final Subquery<UserProfile> userProfileSubquery = query.subquery(UserProfile.class);
                final Root<UserProfile> userProfile = userProfileSubquery.from(UserProfile.class);

                // select up.username from users_profiles ...
                userProfileSubquery.select(userProfile.get("user").get("name"));
                // ... where up.profile in ('admin')
                userProfileSubquery.where(cb.trim(userProfile.get("profile").get("id")).in(profileTypes));

                // select u from users u where u.name in ...
                predicates.add(root.get("name").in(userProfileSubquery));

                return cb.and(predicates.toArray(new Predicate[predicates.size()])); 
            }
        });
   }

关于java - 带有 JPA 子查询的 Spring Data 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57273864/

相关文章:

java - 无法通过 @Query 将集合传递给构造函数

hibernate - 提取后的条件 api 连接抛出无效路径错误

java - 使用 tempus-fugit 和 junit 时如何定义线程数?

mysql - JDBC 连接失败,当第一次尝试登录时,过了一会儿

java - 为什么 Hazelcast 在 CleanupService.registerCache 处具有固定的清理缓存延迟(60 秒)

hibernate - ExampleMatcher.withIgnorePath正在获取被忽略的属性路径

java - RinSim sim.start() 中的 NullpointerException GraphSpatialRegistry 不一致

JAVA - 验证二维数组上的对角线

java - 使用数据库连接创建 .xlsx

java - 我无法以 JPA 问题启动 jboss