2010-07-30 18 views
11

Necesito una lista con tres columnas. la primera y tercera columnas tienen valores mientras que las segundas son nulas. ¿Puedo hacerlo a través de la consulta HQL?¿Puedo seleccionar nulo como valor de columna en la consulta HQL?

necesito algo como esto:

select id, null, name from MyClass 

miclase así como la tabla subyacente tiene sólo dos propiedades/columnas es decir, "id" y "name"

Respuesta

14

Otra opción que parece funcionar (probado en DB2, MySQL, Oracle y SQL Server):

select id, cast(null as char), name from ... 

Usted podría subclase el dialecto de Hibernate y abstracto con una función personalizada:

registerFunction("always_null", 
    new SQLFunctionTemplate(Hibernate.STRING, "cast(null as char)")); 

y luego utilizar esto en su HQL:

select id, always_null(), name from ... 
+0

¡Interesante! ¿Todavía estás obteniendo un 'nulo' 'real' con 'elenco (nulo como char)' o estás obteniendo un '' nulo '? –

+0

Sí, es un verdadero nulo. –

+0

¡Genial! En ausencia de solución genérica en hibernación, salva nuestra piel. Lo bueno es que no tendremos que jugar con objetos Java – WSK

1

yo sepa, su consulta no lo hará devuelve el resultado esperado, solo devolverá las columnas antes denull (id en su caso). Sin embargo, la siguiente funcionaría

select id as first, '', name from MyClass 

No sé si esto es un error o simplemente una característica no soportada (la HQL help: possible to "select NULL as ..."? hilo en los foros de Hibernate parece sugerir que es un error).

No estoy seguro de entender por qué necesita esto (¿podría ser una expresión select new una alternativa?) Pero me temo que tendrá que usar SQL nativo aquí.

+0

"seleccionar nuevo objeto (id, null, nombre) de MyClass" no funciona tan bien – WSK

+0

@SJP Sí, lo sé, pero eso no es lo que quise decir. Me refería a usar 'nuevo Foo (id, nombre)' y establecer un tercer atributo a 'null' en el constructor. –

+0

oh, me perdí tu punto en el primer intento ahora lo tengo. En situaciones donde null es realmente crítico, podemos ponernos en su camino, pero su uso frecuente atormentará las clases de entidad. Por cierto para mi caso actual, tu primera sugerencia funcionó a las mil maravillas. – WSK

1

también puede intentar TO_CHAR (nulo). Funciona bien para HQL- Oracle en el constructor nuevo Foo (id, name, attr3) donde attr3 - Valor de cadena

4

Puede usar la función nullif() para generar nulo.

Acepta dos argumentos. Si los argumentos son iguales, devolverá el valor null.

+0

Me salvaste, muchas gracias. En mi humilde opinión, esta es la solución más limpia. Usar 'NULLIF (1,1)' funciona bien :) –

Cuestiones relacionadas