目前正在使用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;? ...然后设置为构建条件查询的谓词?
答案 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))
);
}