El uso de la APP causas API y elenco 2.0 Criterios generados JPQL a fallar en Hibernate
-
28-09-2019 - |
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
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