使用EclipseLink的Soundex和CriteriaBuilder API

时间:2014-06-13 19:46:57

标签: jpa eclipselink predicate soundex

目前正在使用CriteriaBuilder,Predicates,JPA 2.0和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>();

...我对查询的输入循环

    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表达式的能力,但我可以弄清楚如何将它应用于谓词。

                        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中使用的Expression的文档时遇到很多麻烦。可能吗?是否可以将EclipseLink表达式转换为参数化持久性表达式&lt;&gt;? ...然后设置为构建条件查询的谓词?

1 个答案:

答案 0 :(得分:2)

睡觉后问题,还有一些谷歌搜索。这是我结束的地方:

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