3

NUMBER (実際には、BigDecimal、理由は聞かないでください) 列を持つ静的メタモデルがあります。次に、その数値列に対して LIKE クエリを実行したいと思います。

CriteriaBuilder cb;
cb.like(entity.get(Entity_.numbercol), "123%");

where をentity.get(Entity_.numbercol)返しますPath<BigDecimal>。当然、コンパイル エラーが発生します。...like(Expression<String>, ...) ... not applicable for the arguments (Path<BigDecimal>, ...)

JPAのバグが原因で列のキャストに.as(String.class)失敗しましたが、現在バグ番号が手元にありません。ただし、JPA/Hibernate の最新バージョンでは修正されていません。とにかく、無効な SQL ステートメントが生成されているという実行時例外が発生します。

ここで、SQL に相当する基準 API を取得する方法が必要です。

... WHERE numbercol LIKE '123%';

トピックを検索すると、既に以下の応答が表示されましたが、静的メタモデルを使用しているため役に立ちません: NHibernate - Criteria API で整数列に対して LIKE 検索を行う最も簡単な方法 およびJPA/Criteria API - Like & equal 問題

何か案は?

前もって感謝します ドミニク

4

2 に答える 2

12

まだ解決策を探している人々のために。

HQLstr関数が機能することを知っていれば (少なくとも Hibernate v. 3.6.9.Final では)、次のFunctionExpressionように独自に実装できます。

//plagiarized from org.hibernate.ejb.criteria.expression.function.CastFunction
public class StrFunction<Y extends Number> extends BasicFunctionExpression<String> implements FunctionExpression<String>, Serializable {
    public static final String FCT_NAME = "str";

    private final Selection<Y> selection;

    public StrFunction(CriteriaBuilder criteriaBuilder, Selection<Y> selection) {
        super((CriteriaBuilderImpl) criteriaBuilder, String.class, FCT_NAME);
        this.selection = selection;
    }

    @Override
    public void registerParameters(ParameterRegistry registry) {
        Helper.possibleParameter(selection, registry);
    }

    @Override
    public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
        return FCT_NAME + '(' + ((Renderable) selection).render(renderingContext) + ')';
    }
}

そしてそれを使用します:

cb.like(new StrFunction<Long> (cb, root.get(MyObject_.id)), "%mySearchTerm%");
于 2013-10-22T11:38:22.840 に答える
0

いいえ、バグが原因で失敗することはありません。指定どおりに動作します (たとえばJavadocで):

式に対して型キャストを実行し、新しい式オブジェクトを返します。このメソッドは型変換を引き起こしません。実行時の型は変更されません。警告: ランタイム エラーが発生する可能性があります。

使用するメソッドはキャストを実行し、変換が必要です。一般に、JPA では BigDecimal から String への変換はサポートされていません。

于 2012-03-22T06:49:07.347 に答える