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
Es un error, lo informé: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755 – axtavt
axtavt, gracias. ¿Ya has encontrado una solución? – bruma
la versión más reciente de hibernate-entitymanager (versión) es 3.6.0.Final. – dira