¿Cómo puedo convertir un entero a una cadena en EJBQL?

Tengo una entidad con un número entero

@Entity(name=customer)
public Customer {
    ...
    @Column
    private int number;
    ...
    //getter,setter
}

Ahora quiero convertir este entero en una consulta para compararlo con otro valor.

Intenté esta consulta:

"SELECT c FROM customer c WHERE CAST(c.number AS TEXT) LIKE '1%'"

Pero no funciona.

preguntado el 01 de julio de 12 a las 01:07

intente esto SELECCIONE c DEL cliente c DONDE CAST (c.number AS varchar (5)) COMO '1%' -

@EJP JPQL puede ser una etiqueta más precisa:

@Andi, ¿Hiciste que esto funcionara? -

3 Respuestas

Esto funciona en parte de mi código usando Hibernate:

SELECT c FROM customer c WHERE STR(c.number) LIKE '1%'

En general, esto es lo que Documentos de hibernación (14.10 Expresiones) decir al lanzar:

str() para convertir valores numéricos o temporales en una cadena legible

cast(... as...), donde el segundo argumento es el nombre de un tipo de Hibernate, y extract(... from...) si ANSI cast() y extract() son compatibles con la base de datos subyacente

Respondido 01 Jul 12, 12:07

ejbql es un poco diferente de jpql y hql. Obtengo la misma excepción: Causada por: java.lang.IllegalArgumentException: Se produjo una excepción al crear una consulta en EntityManager: Descripción de la excepción: Error de sintaxis al analizar la consulta [SELECCIONE c DEL cliente c DONDE STR(c.number) LIKE '1% '], línea 1, columna 31: token inesperado [(]. – - Pablo Wasilewski

@Istvan Devai ¡Hombre, estuve buscando todo este día! Gracias. - Matus

@coffy Me alegro de que te haya ayudado :) - István Devai

Desde EJB3, EJBQL ha sido (casi) reemplazado por JPQL. En EJBQL y según http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html en JPQL tampoco hay funcionalidad para CAST una propiedad de una entidad.

Entonces, como ya dije, quedan dos opciones:

  1. Utilice una consulta nativa.
  2. Agregue métodos de conversión especiales a las entidades.

contestado el 14 de mayo de 16 a las 21:05

Debe especificar la columna que está seleccionando de la tabla alias c, y dado que EJBQL no admite una función de conversión, pase una cadena a la consulta en lugar de texto. (Esto permite que su programa realice la conversión antes de llegar a EJBQL).

El siguiente ejemplo está en SQL Server, pero debería darle una idea:

 declare @numberText as varchar(50)
 set @numberText = '1'

 SELECT c.CustomerNumber FROM customer c 
 WHERE c.CustomerNumber  LIKE @numbertext + '%'

Entonces, en lugar de private int number utilizan el private string numberText.

NOTA: Edité esta respuesta después de que OP confirmó que EJBQL no admite una función CAST.

Respondido 06 Jul 12, 13:07

Lo siento, cometí un gran error, no es jpql, es ejb-ql. - Pablo Wasilewski

Prueba mi consulta. Deberia de funcionar. Acabo de editarlo para incluir su columna y tabla. (Originalmente publiqué mi respuesta que se basó en la tabla en la que la probé). jon crowell

Desafortunadamente, no lo hace. Misma excepción: provocada por: java.lang.IllegalArgumentException: se produjo una excepción al crear una consulta en EntityManager: Descripción de la excepción: error de sintaxis al analizar la consulta [SELECCIONE c.number FROM customer c WHERE CAST(c.number AS TEXT) LIKE '1 %'], línea 1, columna 45: token inesperado [(]. - Pablo Wasilewski

Hmmm... ¿puedes probar la consulta sin la cláusula where para ver si funciona? ¿Funciona la consulta actualizada de johntotetwoo? - jon crowell

No, la solución de johntotetwoo tampoco funciona. Claro, si no estoy usando la función CAST, todo funciona bien. - Pablo Wasilewski

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.