2014-06-13 4 views
0

В настоящее время в процессе создания поиска объектов с использованием CriteriaBuilder, Predicates, JPA 2.0 с EclipseLink в качестве поставщика.Использование Soundex и CriteriaBuilder API от EclipseLink

Мой вызов - это доступ к возможностям 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>(); 

... Loop из моих входов в запросе

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», «greatThan», сравнение дат и так далее.

Я хочу включить использование выражения, которое использует оператор soundex() EclipseLink. Использование EclipseLink-провайдера открывает мою способность создавать эклипсинг-выражение, но я не могу понять, как применить его к предикату.

     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 быть преобразовано в параметризованную персистентность? Выражение <>? ... и затем быть установленным как предикат для построенного запроса критериев?

ответ

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)) 
    ); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^