Использование JPA 2.0 Criteria API и приведения приводит к сбою сгенерированного JPQL в Hibernate

Я впервые пользуюсь новым JPA 2.0 Criteria API, и у меня возникла проблема, когда мне нужно преобразовать числовое поле в String, чтобы сравнить его с параметром String. Причина в том, что я хочу искать частичные номера, поэтому я использую «лайк» в CriteriaBuilder. Вот пример кода:

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)

Спасибо


person bruma    schedule 24.11.2010    source источник
comment
Это ошибка, о которой я сообщил: opensource.atlassian.com/projects/hibernate/ просмотреть/HHH-5755   -  person axtavt    schedule 24.11.2010
comment
akstav, спасибо. Вы уже нашли обходной путь?   -  person bruma    schedule 24.11.2010
comment
последняя версия hibernate-entitymanager (выпуск) — 3.6.0.Final.   -  person dira    schedule 25.11.2010
comment
Спасибо becomputer06, вы правы. К сожалению такая же проблема   -  person bruma    schedule 25.11.2010


Ответы (2)


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

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

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

person Mikko Maunu    schedule 20.07.2012
comment
есть идеи, существует ли решение для приведения типов? - person Olimpiu POP; 30.09.2013

Как указал axtavt в комментариях к вопросу, это ошибка в Hibernate 3.6 http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755

person bruma    schedule 26.11.2010