0

現在、EclipseLink をプロバイダーとして CriteriaBuilder、Predicates、JPA 2.0 を使用してオブジェクト検索を作成中です。

私の課題は、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 で使用できる Expression を作成するためのドキュメントを見つけるのに苦労しました。出来ますか?EclipseLink 式をパラメータ化された永続性 Expression<> に変換できますか? ...そして、構築された基準クエリの述語として設定されますか?

4

1 に答える 1

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