2010-07-30 10 views
11

Ich brauche eine Liste mit drei Spalten. Spalte 1. und 3. haben Werte während 2. als Null. Kann ich es durch HQL-Abfrage tun?Kann ich null als Spaltenwert in der HQL-Abfrage auswählen?

ich so etwas wie dieses brauchen:

select id, null, name from MyClass 

Wo MyClass sowie zugrunde liegende Tabelle nur zwei Eigenschaften/Spalten, dh, "id" und "name"

Antwort

14

Eine weitere Option, die (getestet auf DB2, MySQL, Oracle und SQL Server) scheint zu funktionieren:

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

Sie können Unterklasse der Hibernate Dialekt und abstrakt mit einer benutzerdefinierten Funktion:

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

und diese dann in Ihrem HQL verwenden:

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

Interessant! Erhalten Sie immer noch ein "echtes" 'null' mit' cast (null as char) 'oder bekommen Sie einen' 'null''? –

+0

Ja, es ist ein echtes Null. –

+0

Cool! In Ermangelung einer generischen Lösung im Winterschlaf speichert es unsere Haut. Gute Sache ist, wir müssen nicht mit Java-Objekten spielen – WSK

1

AFAIK, Ihre Anfrage wird nicht Rückgabe des erwarteten Ergebnisses, es werden nur die Spalten vor die null (id in Ihrem Fall) zurückgegeben. Allerdings würde die folgenden

select id as first, '', name from MyClass 

arbeitet ich weiß nicht, ob dies ein Fehler ist oder nur eine nicht unterstützte Funktion (der HQL help: possible to "select NULL as ..."? Thread ist auf den Hibernate-Foren scheint es ist ein Fehler vorschlagen).

Ich bin mir nicht sicher, ich verstehe, warum Sie das brauchen (könnte eine select new Ausdruck eine Alternative sein?), Aber ich fürchte, Sie müssen native SQL hier verwenden.

+0

"Wählen Sie ein neues Objekt (ID, Null, Name) von MyClass" funktioniert nicht so gut – WSK

+0

@SJP Ja, ich weiß, aber das ist nicht was ich meinte. Ich meinte 'new Foo (id, name)' und setze im Konstruktor ein drittes Attribut auf 'null'. –

+0

oh, ich habe deinen Punkt im ersten Versuch jetzt verpasst bekommen. In Situationen, in denen null wirklich kritisch ist, können wir uns in die Quere kommen, aber seine häufige Verwendung wird Entitätsklassen durcheinander bringen. Übrigens funktionierte dein erster Vorschlag für meinen aktuellen Fall wie ein Zauber. – WSK

1

Sie auch TO_CHAR (null) versuchen. Es funktioniert gut für HQL - Oracle im Konstruktor neu Foo (ID, Name, attr3), wobei attr3 - String-Wert

4

Sie nullif() Funktion verwenden können, um Null zu generieren.

Es akzeptiert zwei Argumente. Wenn Argumente gleich sind, wird null Wert zurückgegeben.

+0

Sie haben mich gerettet, vielen Dank. IMHO ist dies die sauberste Lösung. Die Benutzung von 'NULLIF (1,1)' funktioniert gut :) –

Verwandte Themen