当前位置: 首页 > 知识库问答 >
问题:

需要查找特定角色的所有用户JPA Criteria API

麻宾白
2023-03-14

我正在实施一个具有以下实体的用户管理系统

public class UserEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    Long id;

    @Column(unique = true, name = "EMAIL")
    private String email;
    @Column(name = "NAME")
    private String name;
    @Column(name = "PASSWORD")
    private String password;
    @Column(name = "MOBILE")
    private String mobile;
    @Column(name = "OWNER_ID")
    private String ownerId;
    @Column(name = "TRAINER_ID")
    private String trainerId;
    @Column(name = "ADDED_ON")
    private Timestamp addedOn;
    @Column(name = "MODIFIED_ON")
    private Timestamp modifiedOn;
    @Column(name = "ADDED_BY")
    private String addedBy;
    @Column(name = "MODIFIED_BY")
    private String modifiedBy;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "USER_ROLES", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"),
            inverseJoinColumns =
            @JoinColumn(name =
                    "ROLE_ID", referencedColumnName = "ROLE_ID"))
    List<RoleEntity> roles;

    @OneToOne(
            mappedBy = "user",
            cascade = CascadeType.ALL,
            orphanRemoval = true,
            fetch = FetchType.LAZY
    )
    private UserStatisticsEntity userStatisticsEntity;

这是角色类:

public class RoleEntity implements GrantedAuthority {

    @Id
    @Column(name="ROLE_ID")
    private String roleId;

    @Column(name="ROLE_NAME")
    private String roleName;

    @ManyToMany(mappedBy = "roles")
    private List<UserEntity> users;

    @Override
    public String getAuthority() {
        return this.roleId;
    }
}

我想获取属于特定角色的所有用户,并且还能够添加有关姓名、手机、电子邮件以及寻呼等的动态where子句。

我当前的代码如下所示,用于使用动态where子句和分页获取用户的选定字段:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

        CriteriaQuery<TrainerDTO> criteriaQuery = criteriaBuilder.createQuery(TrainerDTO.class);
        Root<UserEntity> main = criteriaQuery.from(UserEntity.class);
        criteriaQuery.multiselect(main.get("id"), main.get("name"), main.get("email"), main.get("ownerId"), main.get(
                "mobile"),
                main.get("addedBy"), main.get("modifiedBy"), main.get("addedOn"), main.get("modifiedOn"))
                     .orderBy(criteriaBuilder.desc(main.get("addedOn")))
                     .distinct(true);
        List<Predicate> predicates = new ArrayList<>();
        if (StringUtils.isNotBlank(queryParams.get("mobile"))) {
        predicates.add(criteriaBuilder.and(criteriaBuilder.equal(main.get("mobile"), queryParams.get("mobile"))));
    }
    if (StringUtils.isNotBlank(queryParams.get("name"))) {
        predicates.add(criteriaBuilder.and(criteriaBuilder.like(main.get("name"),
                "%" + queryParams.get("name") + "%")));
    }
    if (StringUtils.isNotBlank(queryParams.get("email"))) {
        predicates.add(criteriaBuilder.and(criteriaBuilder.equal(main.get("email"), queryParams.get("email"))));
    }
        criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
        log.info("TrainerDAO::getAllTrainersPaginatedForOwner Query created...");

        TypedQuery<TrainerDTO> query = entityManager.createQuery(criteriaQuery);
        query.setFirstResult(pageNumber - 1);
        query.setMaxResults(pageSize);
        return query.getResultList();

我在这里遇到两个问题:

  1. 如何获取具有特定角色的所有用户?假设我需要查找角色ROLE_ID = “ROLE_ADMIN”的所有用户。
  2. 在我的分页实现中,中的最后一项在下一页上重复。假设 User1 是第 1 页上的最后一项,他也作为第 2 页上的第一项出现。

请建议如何进一步进行。感谢所有的帮助。

共有1个答案

包德业
2023-03-14

这是我的方式会像这样:

问题1:

您需要访问角色实体以检查role_id是否等于“ROLE_ADMIN”,因此您需要首先从角色实体中获取角色并获取其中的所有信息。

创建主对象后:

Fetch<UserEntity, RoleEntity> fetchedRoles = main.fetch("roles", JoinType.LEFT);
predicates.add(criteriaBuilder.equal( fetchedRoles.get( "roleId" ), "ROLE_ADMIN"));

问题2:

我会试着分享在这种情况下我会怎么做来帮助你解决问题。

假设您在此处创建查询,在此方法中使用可分页对象,您希望返回Page

private Page<Books> getUsersWithAdminRole(String... parameters, Pageable pageable){
  //...

  List<UserEntity> result = entityManager.createQuery(criteria).setFirstResult((int) pageable.getOffset()).setMaxResults(pageable.getPageSize()).getResultList();

  CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
  Root<UserEntity> userCount = countQuery.from(UserEntity.class);
  countQuery.select(criteriaBuilder.count(userCount)).where(criteriaBuilder.and(predicates.toArray(newPredicate[predicates.size()])));
  Long count = entityManager.createQuery(countQuery).getSingleResult();
  Page<UserEntity> userPage = new PageImpl<>(result, pageable, count);
  return userPage;
}

我希望,这是有帮助的。

 类似资料:
  • 我搜索了以下内容:,但没有找到任何内容。 JDA版本:

  • 我确实有一些独特的要求,我想隐藏要从特定角色用户中选择的角色。 例如,我有一个角色名称admin、部门1、部门2和部门3。作为管理员,我应该只能在门户中看到部门1、部门2和部门3的角色管理。 但如果我为管理员定义权限,他/她可以管理角色。管理员用户可以查看Liferay中可用OOTB的所有角色。 有人能帮我配置一下吗?

  • 我有3个用户角色:管理员、客户和员工。 登录后,每个角色将重定向到特定的仪表板,例如:-管理员:网站。com/admin-客户:网站。com/客户-员工:网站。通讯员/雇员 此时,无论我使用哪个用户角色,都可以通过这些网址访问所有内容。 限制客户打开admin的最简单方法是什么 Laravel版本5.2.45 PHP版本7.2我正在使用共享托管提供商。谢谢你们

  • 这是我的OWL文件的一部分: 如何仅从属性中获取

  • 我在一个有这种结构的拉威尔项目中工作 用户:id | first | u name |。。。 角色:id|name 分配的角色:id |用户id |角色id 我认为这是很明显的:p 用户模型 角色模型 我正在寻找一种方法来获取所有具有指定角色(在本例中为“教师”)的用户。我试过这个: 但这总是返回一个包含所有用户的数组。 有人知道为什么会这样吗?谢谢

  • 配置1如下所示。配置2如下所示。 问题始于access_token: 我创建了一个名为moderator的新用户,并使用角色moderator,当我登录到该用户时,我接收我在选项卡“服务帐户角色”中设置的角色(resource_access.efairy-backend.roles),但我希望获得我在角色映射选项卡中声明的角色。 答复: access_token:“EYJHBGCIO...AJBA