La manera correcta de fundición de cadena a número con JPA2 Criterios de la API?

Estoy tratando de escribir una consulta con subselección cuando una cadena se convierte a un tiempo.
Probablemente estoy perdiendo algo?

Consulta sería:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Task> query = cb.createQuery(Task.class);

Root<Task> from = query.from(Task.class);

Subquery<Long> subquery = query.subquery(Long.class);
Root<EntityKeyword> fromKeyword = subquery.from(EntityKeyword.class); 
subquery.select(fromKeyword.get(EntityKeyword_.relatedToId).as(Long.class));
subquery.where(cb.like(fromKeyword.get(EntityKeyword_.keyword), term));

query.where(cb.in(from.get(ModelEntity_.id)).value(subquery));

Donde EntityKeyword_.relatedToId una es la Cadena que requiere de yeso para Largo.

Pero subyacente de Hibernación produce excepción:

Last cause: No data type for node: org.hibernate.hql.ast.tree.MethodNode 
 \-[METHOD_CALL] MethodNode: '('
    +-[METHOD_NAME] IdentNode: 'cast' {originalText=cast}
    \-[EXPR_LIST] SqlNode: 'exprList'
       +-[DOT] DotNode: 'entitykeyw1_.keyword' {propertyName=keyword,dereferenceType=ALL,propertyPath=keyword,path=generatedAlias1.keyword,tableAlias=entitykeyw1_,className=l.i.s.m.s.EntityKeyword,classAlias=generatedAlias1}
       |  +-[ALIAS_REF] IdentNode: 'entitykeyw1_.id' {alias=generatedAlias1, className=l.i.s.m.s.EntityKeyword, tableAlias=entitykeyw1_}
       |  \-[IDENT] IdentNode: 'keyword' {originalText=keyword}
       \-[IDENT] IdentNode: 'int8' {originalText=int8}

Ni idea de lo que está mal. Cualquier ayuda es muy apreciada.

Estoy usando Hibernate 3.6.8-Final

3 Kommentare

  1. 4

    No hay ningún método en los Criterios de la API que realiza la conversión de Cadena Larga.

    Intenta utilizar el método como en Expresión para hacer esta conversión. Javadoc explica por qué se terminan a tener tiempo de ejecución de problemas:

    Realizar una conversión de tipo en la expresión, la devolución de una nueva expresión
    objeto. Este método no causa la conversión de tipos: el tipo en tiempo de ejecución
    no es cambiado. Advertencia: puede resultar en un tiempo de ejecución de fallo.

    CriteriaBuilder tiene montón de métodos para convertir, pero también no hay soporte para la cadena-a-conversión numérica.

  2. 2

    Siguiente método ha funcionado para mí conversión de tipo Cadena a otros tipos de datos utilizando CriteriaBuilder

    CriteriaBuilder queryBuilder = em.getCriteriaBuilder();
    Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Integer.class));
    //Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Long.class));
    //Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Double.class));
    //Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Date.class));
    //Expression roomIdInt = queryBuilder.desc(root.get("room").get("id")).as(Boolean.class));

    Inicialmente me enfrenté a muchos errores con CriteriaBuilder y trató de comprobación de la base de datos de los registros para comprobar la consulta que se ejecuta. Esto ayudó en la corrección de la HQL como sea necesario. El enfoque anterior está funcionando bien en PostgreSQL, pero la solución varía según la Base de datos

  3. 0

    Un tipo de fundición se puede hacer por el CriteriaBuilder aunque.

    CriteriaBuilder queryBuilder = em.getCriteriaBuilder(); 
    Expression roomIdStr = root.get("room").get("id");
    Expression roomIdInt = queryBuilder.function("INT", Integer.class, roomId);

    Véase la respuesta también de Pregunta de StackOverflow 23728108

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea