Я впервые пользуюсь новым API-интерфейсом API JPA 2.0, и я столкнулся с проблемой, когда мне нужно указать числовое поле в String для сравнения он с параметром String. Причина в том, что я хочу искать частичные числа, поэтому я использую «like» в CriteriaBuilder. Вот пример кода:Использование API JPA 2.0 Criteria API и причины литья, вызванные сбоем JPQL в Hibernate
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)
Спасибо вам
Это ошибка, я сообщил об этом: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755 – axtavt 2010-11-24 18:24:25
axtavt, спасибо. Вы нашли обходное решение еще? – bruma 2010-11-24 18:40:11