Skip to content

Instantly share code, notes, and snippets.

@kyip-dev
Last active October 22, 2015 08:08
Show Gist options
  • Save kyip-dev/a9120aa15a71244a58fb to your computer and use it in GitHub Desktop.
Save kyip-dev/a9120aa15a71244a58fb to your computer and use it in GitHub Desktop.
DAO-criteriaBuilder sample
public List<User> searchUser(String email, String mobile, String name, boolean filterDeleted) {
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<User> cqUser = cb.createQuery(User.class);
Root<User> rootUser = cqUser.from(User.class);
cqUser.select(rootUser);
List<Predicate> predicateList = new ArrayList<Predicate>();
Predicate p1 = cb.conjunction();
if (StringUtils.isNotBlank(mobile)) {
Root<PhoneNumber> rootPhone = cqUser.from(PhoneNumber.class);
Predicate linkedUserId = cb.equal(rootUser.get("userId"), rootPhone.<User> get("user").get("userId"));
p1 = cb.and(p1, linkedUserId);
Expression<String> corConcatNumber = cb.concat(rootPhone.<String> get("countryCode"), rootPhone.<String> get("number"));
Predicate likePhoneNumber = cb.like(corConcatNumber, mobile.replace("*", "%"));
predicateList.add(likePhoneNumber);
}
if (StringUtils.isNotBlank(email)) {
predicateList.add(cb.like(rootUser.<String> get("emailAddr"), email.toLowerCase().replace("*", "%")));
}
if (StringUtils.isNotBlank(name)) {
Predicate likeFirstName = cb.like(cb.lower(rootUser.<BasicUserIdentity> get("basicIdentity").<String> get("firstName")), name.toLowerCase().replace("*", "%"));
Predicate likeLastName = cb.like(cb.lower(rootUser.<BasicUserIdentity> get("basicIdentity").<String> get("lastName")), name.toLowerCase().replace("*", "%"));
predicateList.add(cb.or(likeFirstName, likeLastName));
}
Predicate p = cb.or(predicateList.toArray(new Predicate[] {}));
p = cb.and(p1, p);
if (Boolean.TRUE.equals(filterDeleted)) {
p = cb.and(p, cb.not(rootUser.get("status").in(Collections.singletonList(ActivationStatus.DELETED))));
}
cqUser.where(p);
TypedQuery<User> queryUser = getEntityManager().createQuery(cqUser);
List<User> userList = queryUser.getResultList();
return userList;
}
public class User implements Serializable, UserEntity {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "USER_ID")
@GeneratedValue(generator = "USER_GEN")
@GenericGenerator(name = "USER_GEN", strategy = "com.xxx.StringSequenceGenerator", parameters = { @Parameter(name = "sequence", value = "USR_PRF_ID_SEQ") })
private String userId;
@Enumerated(EnumType.STRING)
@Column(name = "TYPE", columnDefinition = "CHAR(1)")
private UserType type;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "REG_DATE")
private Date registrationDate;
@Enumerated(EnumType.STRING)
@Column(name = "STATUS", columnDefinition = "CHAR(1)")
private ActivationStatus status;
@Column(name = "EMAIL_ADDR", columnDefinition = "VARCHAR2(64)")
@Size(max = 64)
private String emailAddr;
@Column(name = "ADDR_ID")
private Long addrID;
@Column(name = "PHONE_ID")
private Long phoneNumID;
@Enumerated(EnumType.STRING)
@Column(name = "FROZEN", columnDefinition = "CHAR(1)")
private FrozenReason frozen;
@Enumerated(EnumType.STRING)
@Column(name = "SUSPENDED", columnDefinition = "CHAR(1)")
private SuspendedReason suspended;
@Column(name = "CURR_CODE", columnDefinition = "CHAR(3)")
@Size(max = 3)
private String defaultCurrencyCode;
@Column(name = "DEFAULT_ACCT_ID")
private Long defaultAccountId;
@Column(name = "AVATAR")
private Long avatar;
@Column(name = "LOCALE", columnDefinition = "VARCHAR2(32 CHAR)")
private String locale;
@Enumerated(EnumType.STRING)
@Column(name = "MARKETING_OPT_IN", columnDefinition = "CHAR(1)")
private OptInType marketingOptIn;
@Embedded
private ChangeLog changeLog;
@OneToOne(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private BasicUserIdentity basicIdentity;
@OneToMany(fetch = FetchType.LAZY)
@OrderBy("updateTimestamp DESC")
@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID", updatable = false)
private List<ChallengeResponse> challenges = new ArrayList<ChallengeResponse>();
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Address> addresses = new ArrayList<Address>();
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<PhoneNumber> phones = new ArrayList<PhoneNumber>();
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP_RLAT", joinColumns = { @JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "GROUP_ID", referencedColumnName = "GROUP_ID", updatable = false) })
private Set<Group> groups = new HashSet<Group>();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment