gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:41:33 25 4
gpt4 key购买 nike

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

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:

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

创建主要对象后:

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;
    }

    希望对你有帮助

    关于java - 需要查找特定角色的所有用户 JPA Criteria API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61850249/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com