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