-1
votes

Déclaration préparée avec quelques conditions dans le cas d'une valeur

J'ai préparé une déclaration comme xxx

et je ne peux pas comprendre quoi faire, si l'utilisateur sélectionne l'option "Toute auteur" ou "Toute thème", que dois-je définir sur une déclaration préparée?


4 commentaires

Vous pouvez passer plus de paramètres pour l'auteur Condicion, pour EJ: Si l'utilisateur sélectionne un auteur, sélectionnez * à partir de livres où (0 = tout ou auteure =?); Ensuite, n'importe quelle valeur doit être 0 et la requête SELECT obtient à tous l'auteur, sinon l'utilisateur Sélectionner et l'auteur, puis n'importe quelle valeur doit être 1 et la requête prenne le ou la condition. Désolé pour mon anglais.


Je ne comprends pas ce que tu veux dire exactement. Je devrais utiliser quelque chose comme déclaration.setint (1, autorid); Je ne comprends donc pas comment je peux passer plus de valeurs.


OK, tout peut être un autre param en tant qu'auteur. Sélectionnez * à partir de livres où (0 =? ou auteur =?); et dans votre code si (l'auteur.isany ()) passe 0 ou 1 à première paramètre et vide en second paramètre,


Je te comprends, mais je pense que sa mauvaise solution, parce que c'est une sorte de mauvaise architecture.


3 Réponses :


0
votes

Je résolvez ce problème en utilisant 4 relevés préparés différentes selon les données d'entrée.


2 commentaires

hmm ... ne sont pas rhéré quatre cas au lieu de trois?


Un cas, quand tout auteur et tout thème que j'ai auparavant, donc je ne compte pas cela, mais vous avez raison, il y a 4 cas.



1
votes

Quelles parties de l'instruction SQL doivent être présentes n'est pas couverte par des déclarations préparées (à moins que vous ne soyez créatif). Typiquement, la solution génère les conditions dans la clause où code> dynamiquement, par exemple: xxx pré>

après avoir préparé la déclaration, vous devez définir les paramètres, prendre Soin de l'utilisation des bons index: P>

int parameterIndex = 1;
if (author != null) {
    preparedStatement.setString(parameterIndex, author);
    parameterIndex++;
}
if (theme != null) {
    preparedStatement.setString(parameterIndex, theme);
    parameterIndex++;
}


3 commentaires

Je n'utilise pas la concaténation, seulement des déclarations préparées, vous savez, des trucs de sécurité.


Utilisez la concaténation pour construire le SQL pour la déclaration préparée des pièces constantes fixes, NE PAS l'utiliser pour remplir des paramètres. Qu'allez-vous faire autrement, écrivez 2 questions pour n paramètres pouvant être facultatifs?


Oh oui, désolé je ne vous ai pas d'abord, vous avez raison, je peux construire une déclaration préparée en fonction des paramètres de l'entrée avant de l'utiliser.



2
votes

Ceci est un cas pour "SQL dynamique". Vous pouvez le faire manuellement ou utiliser un orj.

Voir le cas manuel: xxx

MAINTENANT, si vous avez 10 paramètres, un ormes aide vraiment beaucoup. À peu près, tous soutiennent SQL dynamique de manière vraiment belle.


1 commentaires

Merci pour une réponse détaillée, oui, c'est l'option.