私は新しい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)を使用しています
ありがとうございました