2010-11-24 2 views
6

Я впервые пользуюсь новым 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)

Спасибо вам

+0

Это ошибка, я сообщил об этом: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755 – axtavt 2010-11-24 18:24:25

+0

axtavt, спасибо. Вы нашли обходное решение еще? – bruma 2010-11-24 18:40:11

ответ

4

Что это относится к JPA, метод Expression.as используется для обслуживания неправильной цели. Литье Expression<Number> на Expression<String> не должно работать через Expression.as. Конечно, было бы неплохо иметь ясное сообщение об ошибке вместо неправильного JPQL.

Как сказано в документации, он выполняет преобразование типа, который отличается понятие, чем переход от типа к другим:

Выполните приведение типа на выражение, возвращая новый объект выражения . Этот метод не вызывает преобразования типов: тип времени выполнения не изменяется. Предупреждение: может привести к сбою во время выполнения.

 Смежные вопросы

  • Нет связанных вопросов^_^