Ich habe zwei Zeilen in MySQL wie dieseSo verwenden Hibernate eqOrIsNull()
+---------+---------+
| foo | bar |
+---------+---------+
| | NULL |
| | |
+---------+---------+
Wo leer sind leere Strings ""
.
Jetzt möchte ich beide bekommen. Ich verwende Criteria
und Restrictions.eqOrIsNull()
für beide Spalten, aber es gibt immer nur eine Zeile zurück.
Der Code ist wie diese
criteria.add(Restrictions.eqOrIsNull("foo", ""));
.add(Restrictions.eqOrIsNull("bar", ""));
Und wenn ich Kriterien hinzufügen nur auf foo
, gibt es zwei Reihen. Aber für bar
gibt es nur die Sekunde zurück, die leer ist.
Die javadoc sagt, Apply an "equal" constraint to the named property. If the value is null, instead apply "is null".
Also bekomme ich das falsch, oder sollte es auf andere Weise verwendet werden?
UPDATE:
Sorry, ich bin so sorglos. Der Doc sagt es deutlich. Diese Methode arbeitet nach dem übergebenen value
, nicht dem tatsächlichen Wert der in der DB gespeicherten benannten Eigenschaft.
Quellcode auf Github:
public static Criterion eqOrIsNull(String propertyName, Object value) {
return value == null
? isNull(propertyName)
: eq(propertyName, value);
}
Also in meinem Fall eqOrIsNull
kehrt eq("")
. Ich hätte die Disjunktion von und isNull
, wie Gregory answered verwenden sollen.
Für diese Art von Problemen sollten Sie Debug-Protokollierung aktivieren. Es wird Hibernate print die ausführende SQL machen. – adam0404
Es ist wie 'wählen foo, bar aus der Tabelle wo foo =? und bar =? ' – hsluo