2014-06-13 6 views
0

현재 CriteriaBuilder, Predicates, 공급자로 EclipseLink를 사용하여 JPA 2.0을 사용하여 객체 검색을 만드는 과정입니다.EclipseLink에서 Soundex 및 CriteriaBuilder API 사용

나의 도전은 soundex 기능에 액세스하여 동적으로 만들어진 기준에 적용하는 것입니다.

CriteriaBuilder cb = PersistenceUtil.getEntityManager().getCriteriaBuilder(); 
    CriteriaQuery<Registration> q = cb.createQuery(Registration.class); 
    Root<Registration> dr = q.from(Registration.class); 

    List<Predicate> predicates = new ArrayList<Predicate>(); 

... 쿼리

predicates.add(cb.equal(dr.get(fieldName),fieldValue)); 

내 입력의 루프 ... 그리고 마지막으로

q.select(dr).where(predicates.toArray(new Predicate[]{})); 

    TypedQuery<Registration> query = PersistenceUtil.getEntityManager().createQuery(q).setMaxResults(maxResults); 

    List<DeathRegistration> results = query.getResultList(); 

이 분명 단순한 기준 빌더 항목에 대해 잘 작동하고, 내가 할 수있는 'like', 'greaterThan', 날짜 비교 등을 사용하십시오.

EclipseLink soundex() 연산자를 사용하는 Expression을 사용할 수있게하려고합니다. EclipseLink 프로 바이더를 사용하면 eclipselink Expression을 생성 할 수있는 능력이 생기지 만,이를 프리디 케이트에 적용하는 방법을 찾아 낼 수는 없습니다.

     ReadAllQuery raq = new ReadAllQuery(Registration.class);   
         ExpressionBuilder eb = raq.getExpressionBuilder(); 
         org.eclipse.persistence.expressions.Expression fnExp = ExpressionOperator.soundex().expressionFor(eb.get(fieldName)); 
         org.eclipse.persistence.expressions.Expression fnVal = fnExp.equal(fieldValue); 

CriteriaBuilder에서 사용할 수있는 표현식을 만들 수있는 문서를 찾는 데 많은 어려움이 있습니다. 가능한가? EclipseLink Expression을 매개 변수화 된 지속성으로 변환 할 수 있습니까? Expression <>? ... 그리고 나서 만들어진 criteria 질의를위한 술어로 설정 될 것인가?

답변

1

문제를 털어 놓고 더 많은 인터넷 검색 결과를 보았습니다. 나는 결국 어디에 여기에 있습니다 :

Expression<String> exp = dr.get(fieldName); 
    Expression<String> expName = CriteriaBuilderHelper.functionSoundexName(cb, exp); 
    Expression<String> expValue = CriteriaBuilderHelper.functionSoundexValue(cb, fieldValue);        
    predicates.add(cb.equal(expName, expValue)); 

내 기능 :

private static final String SOUNDEX = "soundex"; 
/** 
* @param cb the CriteriaBuilder to use 
* @param value the value to soundex 
* @return Expression<String> 
*/ 

public static Expression<String> functionSoundexName(CriteriaBuilder cb, Expression<String> exp) { 
    return cb.function(
     SOUNDEX, 
     String.class, 
     cb.lower(exp) 
    ); 
} 

public static Expression<String> functionSoundexValue(CriteriaBuilder cb, String value) { 
    return cb.function(
     SOUNDEX, 
     String.class, 
     cb.lower(cb.literal(value)) 
    ); 
}