을 사용하고
내가 대신 조건 API를 사용하십시오.
public List<User> findUsersByFullName(final String fullName){
final String[] parts = fullName.split("\\s+");
if(parts.length != 2){
// probably you should assemble first name from all parts
// except the last, but I'm lazy
throw new IllegalArgumentException("Bad name: " + fullName);
}
return findUsersByName(parts[0], parts[1]);
}
public List<User> findUsersByLastName(final String lastName){
return findUsersByName(null, lastName);
}
public List<User> findUsersByFirstName(final String firstName){
return findUsersByName(firstName, null);
}
참조 :
public List<User> findUsersByName(final String firstName,
final String lastName){
final boolean hasFirst = firstName != null && firstName.length() > 0;
// if you use Apache Commons/Lang, do it like this:
// final boolean hasFirst = StringUtils.isNotBlank(firstName);
final boolean hasLast = lastName != null && lastName.length() > 0;
if(!hasFirst && !hasLast){
// or throw IllegalArgumentException
return Collections.emptyList();
}
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<User> query = cb.createQuery(User.class);
final Root<User> root = query.from(User.class);
if(hasFirst && hasLast){
query.where(cb.and(
likeExpression(cb, root,"lname", lastName),
likeExpression(cb, root, "fname", firstName)
));
} else if(hasFirst){
query.where(likeExpression(cb, root,"fname", firstName));
} else{
query.where(likeExpression(cb, root,"lname", lastName));
}
return em.createQuery(query).getResultList();
}
private static Predicate likeExpression(final CriteriaBuilder cb,
final Root<User> root,
final String path, String parameter){
return cb.like(root.<String> get(path), "*"+parameter.trim()+"*");
}
: 다음은 샘플 구현입니다
신난다, 나는 그것을 시험해 볼 것이다. 아마도 당신에게 몇 가지 질문이있을 것입니다. 고맙습니다. +1 –
모든 변수에 대해 final을 사용하는 이유가 있습니까? –
@Harry a) 변수가 다시 할당되지 않는다는 것을 문서화하는 것이 좋습니다. b) 컴파일러가 코드를 최적화 할 수 있도록합니다. 여기 예제 : http://www.coderanch.com/t/518466/Performance/java/Compiler-optimization-final-variables –