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.
Per questo tipo di problemi, è necessario abilitare la registrazione di debug. Farà ibernare stampare l'eseguendo sql. – adam0404
È come "seleziona foo, bar dal tavolo dove foo =?" e bar =? ' – hsluo