Reputation: 44
I would like to ask how to use JPA Specification for class with List attribute. Lets assume, we have a user which can have multiple roles at the same time. I want to get all users from DB Where role List and userId List are given
@Entity(name = "UserEntity")
public class User {
Private Long id;
private String name;
private String surname;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "OA_USER_ROLE_DTL", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"))
@OrderBy
@JsonIgnore
private Collection<Role> roles;
}
Upvotes: 0
Views: 4354
Reputation: 44
Answer to my question
public class UserSpecification implements Specification<UserEntity> {
private Set<String> roleNames;
private Set<Long> userId;
private Date startDate;
private Date endDate;
private String emailId;
private String userName;
private String mobileNo;
private Long clientId;
@Override
public Predicate toPredicate(Root<UserEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> finalPredicate = new ArrayList<Predicate>();
if (roleNames != null && !roleNames.isEmpty()) {
Join<UserEntity, Role> userRoleJoin = root.join(ROLES);
Predicate roleName = userRoleJoin.get(ROLE_NAME).in(roleNames);
finalPredicate.add(roleName);
}
if (userId != null && !userId.isEmpty()) {
Predicate userIdPredicate = root.get(ID).in(userId);
finalPredicate.add(userIdPredicate);
}
if (!StringUtils.isEmpty(emailId)) {
finalPredicate.add(criteriaBuilder.equal(root.get(EMAIL_ID), emailId));
}
if (!StringUtils.isEmpty(userName)) {
finalPredicate.add(criteriaBuilder.equal(root.get(USERNAME), userName));
}
if (!StringUtils.isEmpty(mobileNo)) {
finalPredicate.add(criteriaBuilder.equal(root.get(MOBILE_NUM), mobileNo));
}
if(clientId!=null && clientId!=0L) {
finalPredicate.add(criteriaBuilder.equal(root.get(CLIENT_ID), clientId));
}
if (startDate != null && endDate != null) {
Path<Date> path = root.get(CREATED_DATE);
finalPredicate.add(criteriaBuilder.between(path, startDate, endDate));
}
query.distinct(true);
Predicate and = criteriaBuilder.and(finalPredicate.toArray(new Predicate[finalPredicate.size()]));
return and;
}
}
Upvotes: 1