2011-01-19 2 views
0

Java + JPA : 데이터베이스에서 사용자 검색 이름과 성을 반환하면 너무 많은 결과가 반환됩니다. 더 좋은 방법이 있습니까?

name array 다음 name array 통해 반복하고 각 name 일치하는 경우 일치합니다. 내 이름과 성 필드에 대해 다음과 같이

그러나 이렇게하면 너무 많은 결과를 반환합니다. (피터와 관련된 모든 것은 표시되며 Smith와 관련된 모든 내용도 포함됩니다.)). 이 작업을 수행하는 더 좋은 방법이 있습니까?

EclipseLink btw

을 사용하고 있습니다.

답변

3

을 사용하고

내가 대신 조건 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); 
} 

참조 :

  • 자바 EE 6 자습서 : Using the Criteria API to Create Queries
  • 쉽게이 방법의 오버로드 된 버전을 만들 수 있습니다 지금

    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()+"*"); 
    } 
    

    : 다음은 샘플 구현입니다

+0

신난다, 나는 그것을 시험해 볼 것이다. 아마도 당신에게 몇 가지 질문이있을 것입니다. 고맙습니다. +1 –

+0

모든 변수에 대해 final을 사용하는 이유가 있습니까? –

+1

@Harry a) 변수가 다시 할당되지 않는다는 것을 문서화하는 것이 좋습니다. b) 컴파일러가 코드를 최적화 할 수 있도록합니다. 여기 예제 : http://www.coderanch.com/t/518466/Performance/java/Compiler-optimization-final-variables –

관련 문제