Last active
October 22, 2015 08:08
-
-
Save kyip-dev/a9120aa15a71244a58fb to your computer and use it in GitHub Desktop.
DAO-criteriaBuilder sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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