select * from users where id in ()
La requête est montrée ci-dessus.
<select id="getByIds" resultMap="BaseResultMap">
SELECT
<include refid="BaseColumnList"/>
FROM users
WHERE id IN
<foreach item="id" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</select>
Si Param ids
est vide, Mybatis lèvera BadSqlGrammarException, qui génère une requête comme 'select * from users where id in
'.
Comment ignorer la requête et retourner une liste vide si ids
est vide?
Comment ignorer la requête et retourner une liste vide si les identifiants sont vides?
Pour ignorer la requête (ne pas l'exécuter), n'appelez tout simplement pas Mybatis. Le code appelant doit vérifier si ids est vide:
return null == ids || ids.isEmpty() ? new ArrayList<User>() : session.select("getByIds", ids);
C'est exactement ce qui est demandé dans la question.
Si vous voulez vraiment que Mybatis gère cela, la requête produite doit être valide car doit être exécutée (puis non ignorée) pour retourner un résultat vide rapidement. cela signifie oublier quelque chose comme id = <!-- a value that will never exist in the table -->
car cela pourrait sûrement impliquer une analyse complète (gratuite et inutile) pour rechercher la valeur inexistante. Alors:
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>
Une autre option pour confirmer consisterait à utiliser des intercepteurs pour "annuler" la requête avant son exécution, mais c'est certainement une complexité excessive pour ce qui doit être réalisé ici.
fonction de code Java
List<ApiPriceChlogEntity> getApiAndDevPrice(@Param("apiKeys") List<String> currentApiKey, @Param("devKeys") List<String> currentDevKey, @Param("startDate") Date startDate);
le fichier mappeur
<select id="getApiAndDevPrice" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM t_api_price_chlog tab1
<where>
<if test="apiKeys.size() > 0">
tab1.api_key IN
<foreach collection="apiKeys" item="item" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
<if test="devKeys.size() > 0">
AND tab1.dev_key IN
<foreach collection="devKeys" item="item" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
<if test="startDate != null">
AND tab1.change_date >= #{startDate}
</if>
</where>
Je l'ai testé, j'espère vous aider.
Utilisation du test:
<select id="getByIds" resultMap="BaseResultMap">
SELECT
<include refid="BaseColumnList"/>
FROM users
<if test="ids!= null">
WHERE id IN
<foreach item="id" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</if>
</select>