0

目前正在使用 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() 运算符的表达式。使用 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 表达式转换为参数化的持久性表达式<>吗?...然后被设置为内置条件查询的谓词?

4

1 回答 1

2

睡觉后就这个问题了,又google了一番。这是我结束的地方:

    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))
    );
}
于 2014-06-17T14:31:39.110 回答