2010-11-24 18 views
6

Soy un usuario por primera vez de la nueva API de Criterios JPA 2.0 y me encuentro con un problema cuando necesito convertir un campo numérico en String para comparar con un parámetro de cadena. La razón es que quiero buscar números parciales, entonces uso un 'me gusta' en el CriteriaBuilder. Aquí está un ejemplo de código:Usando JPA 2.0 Criteria API y el molde causa que JPQL generado falle en 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); 
      } 
     } 

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 se ejecuta este código, el subyacente JPA 2.0 aplicación 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, ¿me pueden ayudar?

que utilizar la última versión de Hibernate (3.6.0.CR2)

Gracias

+0

Es un error, lo informé: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755 – axtavt

+0

axtavt, gracias. ¿Ya has encontrado una solución? – bruma

+0

la versión más reciente de hibernate-entitymanager (versión) es 3.6.0.Final. – dira

Respuesta

4

Lo se trata de JPA, Expression.as method se usa para servir al propósito equivocado en cuestión. Se supone que la conversión Expression<Number> a Expression<String> funciona a través de Expression.as. Por supuesto, sería bueno tener un mensaje de error claro en lugar de un JPQL incorrecto.

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

Realizar un encasillado de la expresión, que devuelve un nuevo objeto expresión. Este método no causa conversión de tipo: el tipo de tiempo de ejecución no se cambia. Advertencia: puede provocar un error en el tiempo de ejecución.

+0

alguna idea si existe una solución para el encasillado? –

Cuestiones relacionadas