2013-10-11 17 views
7

Ho due righe in MySQL come questoCome usare Hibernate eqOrIsNull()

+---------+---------+ 
| foo  | bar  | 
+---------+---------+ 
|   | NULL | 
|   |   | 
+---------+---------+ 

Dove vuoto sono stringhe vuote "".

Ora voglio averli entrambi. Io uso Criteria e Restrictions.eqOrIsNull() su entrambe le colonne, ma restituisce sempre solo una riga.

Il codice è come questo

criteria.add(Restrictions.eqOrIsNull("foo", "")); 
     .add(Restrictions.eqOrIsNull("bar", "")); 

E quando aggiungo solo su criteri foo, restituisce due righe. Ma per bar, restituisce solo il secondo, che è vuoto.

Il javadoc dice, Apply an "equal" constraint to the named property. If the value is null, instead apply "is null". Quindi ho sbagliato, o dovrebbe essere usato in altri modi?

UPDATE:
dispiace, io sono così sbadato. Il documento lo afferma chiaramente. Questo metodo funziona secondo lo value passato ad esso, non il valore effettivo della proprietà denominata memorizzata nel DB.
codice sorgente su Github:

public static Criterion eqOrIsNull(String propertyName, Object value) { 
    return value == null 
      ? isNull(propertyName) 
      : eq(propertyName, value); 
} 

Quindi, nel mio caso, eqOrIsNull rendimenti eq(""). Avrei dovuto usare la disgiunzione di eq e isNull, come Gregory answered.

+1

Per questo tipo di problemi, è necessario abilitare la registrazione di debug. Farà ibernare stampare l'eseguendo sql. – adam0404

+0

È come "seleziona foo, bar dal tavolo dove foo =?" e bar =? ' – hsluo

risposta

2

Controllare se il codice fa quello che vuoi -

criteria.add(Restrictions.or(Restrictions.eq("foo", ""), Restrictions.isNull("foo"))) 
       .add(Restrictions.or(Restrictions.eq("bar", ""), Restrictions.isNull("bar"))); 

Questo frammento di codice utilizza Hibernate 3.5.0-CR-2 API.

+0

Funziona in questo caso, ma se una colonna ha un contenuto non vuoto, otterrà anche quello. – hsluo

+0

Gotcha, vedere la risposta aggiornata. –

+2

Questo funziona ... potresti spiegare perché è diverso da 'eqOrIsNull()'? Sto usando Hibernate 4.2.5. – hsluo

2

Applicare un vincolo "uguale" alla proprietà denominata. Se il valore è null, applicare "è nullo".

Questo significa che is null verrà applicato solo se NULL viene passato come valore. Se si specifica un'altra stringa come valore, verrà applicato solo lo equal.

Questo è utile quando non si è sicuri del valore effettivo passato al runtime come argomento del valore del parametro. In uno scenario del genere, in modo tradizionale, è necessario inserire un criterio di controllo non nullo & in base alla condizione non nulla o è necessario scrivere criteri nel modo indicato dalla risposta di Gregory.

Tenendo a mente tutti questi fatti, dovresti ottenere una risposta alla tua domanda. Stai ricevendo solo quelle righe che contengono il valore vuoto & e non quello con valore NULL, perché hai specificato una stringa vuota come secondo argomento. Se si specifica NULL come secondo argomento, si otterranno solo le righe con valore NULL.

Fammi sapere se ti è utile.

+0

Grazie per la spiegazione. Ho letto il documento e il codice sorgente e ho trovato il mio problema. Vedi il mio aggiornamento. – hsluo