7

私は新しいJPA2.0Criteria APIを初めて使用しますが、文字列パラメーターと比較するために数値フィールドを文字列にキャストする必要があるときに問題が発生します。理由は、部分的な数値を検索したいので、CriteriaBuilderで「like」を使用するためです。コードサンプルは次のとおりです。

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<ParcelDO> cq = cb.createQuery(ParcelDO.class);
        Root<ParcelDO> parcelDO = cq.from(ParcelDO.class);
        cq.select(parcelDO);

        String parcelNumberId = parcelSearchDetailDO.getParcelNumberId();
        if (parcelNumberId != null && !parcelNumberId.isEmpty()) {
            Predicate parcelNumberIdPredicate = cb.like(
                    parcelDO.<Long> get("parcelNumberId").as(String.class),
                    parcelNumberId + "%");

            if (cq.getRestriction() != null) {
                cq.where(cq.getRestriction(), parcelNumberIdPredicate);
            } else {
                cq.where(parcelNumberIdPredicate);
            }
        }

重要な部分は

Predicate parcelNumberIdPredicate = cb.like(
                    parcelDO.<Long> get("parcelNumberId").as(String.class),
                    parcelNumberId + "%");

ここで、Criteria APIを使用して、パスをCriteriaBuilderの同様のメソッドに必要な式に変換します。

実行してこのコードを実行すると、基盤となるJPA 2.0実装Hibernateは、次の例外を除いて失敗します。

Caused by: org.hibernate.hql.ast.QuerySyntaxException:
expecting CLOSE, found '(' near line 1, column 117 
[select generatedAlias0 from domain.ParcelDO as generatedAlias0 where
cast(generatedAlias0.parcelNumberId as varchar2(255 char)) like :param0]

Hibernateが正しくないJPQLを生成しているように見えます。

何が悪いのかわかりませんが、手伝ってもらえますか?

最新のHibernateバージョン(3.6.0.CR2)を使用しています

ありがとうございました

4

2 に答える 2

4

JPAに関して言えば、Expression.asメソッドは、問題の間違った目的を果たすために使用されます。にキャストExpression<Number>することは、 Expression.asExpression<String>を介して機能することは想定されていません。もちろん、誤ったJPQLではなく、明確なエラーメッセージが表示されると便利です。

ドキュメントに記載されているように、型キャストを実行します。これは、型から他の型への変換とは異なる概念です。

式に対して型キャストを実行し、新しい式オブジェクトを返します。この方法では型変換は行われません。実行時型は変更されません。警告:実行時に障害が発生する可能性があります。

于 2012-07-20T12:15:01.090 に答える
3

質問のコメントで axtavt が述べているように、これは Hibernate 3.6 のバグです http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755

于 2010-11-26T23:59:20.047 に答える