【问题标题】:Using Soundex and CriteriaBuilder API from EclipseLink使用 EclipseLink 中的 Soundex 和 CriteriaBuilder API
【发布时间】:2014-08-04 10:59:23
【问题描述】:

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

【问题讨论】:

    标签: jpa eclipselink predicate soundex


    【解决方案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))
        );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多