Wie kann ich Abfrage überspringen und leere Liste zurück, wenn Ids leer ist?
Um überspringen die Abfrage (nicht ausführen), nennen Sie einfach nicht Mybatis. Die Telefonvorwahl sollten überprüfen, ob ids leer ist:
return null == ids || ids.isEmpty() ? new ArrayList<User>() : session.select("getByIds", ids);
Das ist genau das, was in der Frage gestellt wird.
Wenn Sie wirklich möchten, dass MyBatis dies behandelt, dann muss die erzeugte Abfrage gültig sein, da sie ausgeführt werden muss (dann nicht übersprungen werden), um das leere Ergebnis schnell zurückzugeben. das bedeutet, dass man etwas wie id = <!-- a value that will never exist in the table -->
vergisst, weil es sicherlich einen (freien und nutzlosen) vollständigen Scan beinhalten könnte, um den nicht existierenden Wert zu suchen. Dann:
WHERE
<choose>
<when test="ids==null || ids.isEmpty()">
1 = 0 <!-- a test returning false, to adapt depending on you DB vendor -->
</when>
<otherwise>
id IN <foreach item="id" collection="ids" open="(" separator="," close=")">#{id}</foreach>
</otherwise>
</choose>
Eine weitere Möglichkeit würde darin bestehen, zu bestätigen Abfangjäger bei der Verwendung der Abfrage vor der Ausführung auf „Abbrechen“, aber dies ist auf jeden Fall viel die Gute Komplexität für das, was hier erreicht werden.
Dies erzeugt eine gültige Abfrage, die ausgeführt wird und alle Benutzer im Gegensatz zu den angeforderten OPs zurückgibt. – blackwizard