Pregunta

Soy un usuario por primera vez de los nuevos criterios de la API JPA 2.0 y estoy corriendo en un problema cuando necesito para emitir un campo de número de cuerdas para compararlo con un parámetro de cadena. La razón es que quiero buscar números parciales, así que utilizo un 'me gusta' en la CriteriaBuilder. Aquí está un ejemplo de código:

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);
            }
        }

La parte importante es

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

donde uso de la API Criterios para convertir el trazado en una expresión necesaria para el método como en el CriteriaBuilder.

Ahora en que funciono y ejecuta este código, el subyacente implementación de JPA 2.0 Hibernate falla con la siguiente excepción:

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]

Me parece que Hibernate está generando una JPQL que no es correcta.

no tengo idea de lo que está mal, puedo ayudarle?

Yo uso la versión más reciente de hibernación (3.6.0.CR2)

Gracias

¿Fue útil?

Solución 2

Como axtavt se indica en los comentarios en la pregunta, que es un error en Hibernate 3.6 http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755

Otros consejos

Lo que se trata de la APP, el método Expression.as se utiliza para servir al propósito equivocada de que se trate. Fundición Expression<Number> a Expression<String> no se supone que el trabajo a través de Expression.as . Por supuesto que sería bueno tener claro mensaje de error en lugar de JPQL incorrecta.

Como dijo en la documentación, se realiza encasillado, que es concepto diferente que la conversión de un tipo a otro:

  

Realizar un encasillado de la expresión, el retorno de una nueva expresión   objeto. Este método no causa la conversión de tipos: el tipo de tiempo de ejecución   no se cambia. Advertencia:. Puede resultar en un fallo en tiempo de ejecución

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top