Frage

Gibt es eine Möglichkeit optionale Parameter angeben (zB beim Suchparameter von einer Form zur Verfügung gestellt werden und nicht alle Parameter erforderlich sind) in einer benannten Abfrage bei der Verwendung von Hibernate ? Ich bin mit einer nativen SQL Abfrage, aber die Frage ist wahrscheinlich für den Namen HQL Abfragen als auch.

Ich bin ziemlich sicher, dass die Antwort darauf ist ‚Nein‘, aber ich habe festgestellt, nicht die endgültige Antwort in der Dokumentation vor.

War es hilfreich?

Lösung

AFAIK, gibt es nicht so etwas, so dass Sie eine dynamische Abfrage für diesen schreiben müssen. Vielleicht haben Sie einen Blick auf diese vorherige Antwort zeigt, wie dies in HQL zu tun ( dass Sie zu SQL) umsetzen und auch zeigen, wie die Kriterien API macht es einfacher und somit besser für diesen Job meiner Meinung nach geeignet.

Update: (Kommentar aus dem OP zu beantworten) Arbeiten mit einer Legacy-Datenbank kann mit Hibernate in die Tat schwierig sein. Vielleicht können Sie eine dynamische nativen Abfrage verwenden und das Rück nicht --managed Einheiten though. Aber auf lange Sicht könnte es noch schlimmer (Ich kann nicht sagen, dass für Sie). Vielleicht Hibernate ist nicht die beste Wahl in Ihrem Fall und so etwas wie iBATIS würden Sie die Flexibilität, die Sie benötigen.

Andere Tipps

Wie bereits erwähnt in einem andere Antwort auf die Frage zuvor referenzierten , das folgende HQL-Konstrukt funktioniert für mich:

select o from Product o WHERE :value is null or o.category = :value

Wenn :value in als null übergeben wird, werden alle Produkte zurückgegeben.

Siehe auch Optional oder Null-Parameter

Beachten Sie, dass dies nicht funktionieren wird in einigen Versionen von Sybase aufgrund diesen Fehler , so dass die folgende ist eine Alternative:

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value

leider die Lösung unter „Optional oder Null-Parameter“ funktioniert nicht für IN-Listen. Ich hatte die Abfrage geändert wie folgt ...

Named Query-Definition:

select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))

Code:

Set<KiHandlingTypeEnum> inHandlingTypes = ...

Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);

List<KiLogicalStock> stocks = query.getResultList();

Viel Spaß an der Arbeit.

Eine andere Lösung für optionale Liste Parameter ist die Handhabung von NULL-Überprüfung der von Hibernate unterstützt gibt die ersten nicht-null-Parameter aus einer Liste, so dass Sie für null auf einer Liste zu überprüfen, ohne die Syntax zu brechen, wenn es mehrere Einträge in der Liste ist.

HQL Beispiel mit optionalen Parametern und Parameterliste:

select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
  and ( :parameter is null or obj.field2 = :parameter )

Das ist für mich mit einem SQL Server Dialekt gearbeitet.

Für diejenigen, die Probleme mit NULL-Werten, eine weitere Option ist es, einen alternativen Wert zu verwenden. In meinem Fall habe ich nur positive Werte für meine Kategorie Feld, die mich als meinen Ersatzwert verwenden kann = -1.

Deshalb, bevor die Abfrage auszuführen, können Sie eine kleine Validierungs machen:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top