Domanda

C'è un modo per specificare i parametri opzionali (come ad esempio quando i parametri di ricerca sono forniti da un modulo e non sono necessari tutti i parametri) in una query di nome quando si utilizza Sospensione ? Io sto usando un , ma la questione è probabilmente applicabile a nome HQL query pure.

Sono abbastanza sicuro che la risposta a questa domanda è 'no', ma non ho ancora trovato la risposta definitiva nella documentazione.

È stato utile?

Soluzione

Per quanto ne sappia, non v'è nulla di simile in modo da dovrete scrivere una query dinamica per questo. Forse dare un'occhiata a questo risposta precedente che mostra come fare questo in HQL ( che si può trasporre a SQL) e mostra come l'API Criteri rende più semplice ed è quindi più adatto per questo lavoro a mio parere.

Aggiornamento: (rispondendo a un commento da OP) Lavorare con un database legacy può essere davvero difficile con Hibernate. Forse si può utilizzare una query nativo dinamica e tornare non entità -computer però. Ma nel lungo periodo, le cose potrebbero peggiorare (non posso dire che per voi). Forse Hibernate non è la scelta migliore nel tuo caso e qualcosa come iBATIS darebbe la flessibilità necessaria.

Altri suggerimenti

Come menzionato in un diversa al domanda fa riferimento in precedenza, il seguente HQL costruire opere per me:

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

se :value viene passato come null, tutti i prodotti sono restituiti.

Si veda anche opzionale o null Parametri

Si noti che questo non funzionerà in alcune versioni di Sybase a causa di questo bug , in modo che segue è un'alternativa:

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

purtroppo la soluzione sotto "Parametri facoltativi o Null" non funziona per le liste IN. Ho dovuto cambiare la query come segue ...

definizione query denominata:

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

Codice:

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();

Molto divertimento di lavoro.

Un'altra soluzione per la gestione parametri delle liste opzionali è controllando nullo usando l' coalesce funzione. COALESCE è supportato da Hibernate restituisce il primo parametro non nullo da un elenco, che permette di controllare per nulla in un elenco senza rompere la sintassi quando ci sono più elementi nell'elenco.

esempio HQL con il parametro dei parametri e elenco opzionale:

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

Questo ha funzionato per me con un dialetto SQL Server.

Per coloro che hanno problemi con i valori NULL, un'altra opzione è quella di utilizzare un valore alternativo. Nel mio caso, ho usato solo valori positivi per il mio campo categoria, che mi permette di usare come il mio valore alternativo = -1.

Pertanto, prima di eseguire la query, si può fare una piccola convalida:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top