2011-05-18 4 views
0

J'ai une table de base de données, disons CarTb, et un frontal qui vous permet de parcourir les voitures d'occasion disponibles à la vente.Fournir un nombre variable d'arguments à une procédure stockée/SQL

En face avant je peux filtrer aussi peu ou autant que je veux - montrez-moi toutes les voitures bleues, montrez-moi toutes les voitures rouges avec 4 portes, montrez-moi toutes les voitures avec le numéro de rego XXX123 OU capacité ipod et cinq haut-parleur stéréo. Ce que je veux être en mesure de faire sur le backend Java est de construire un système qui interroge la base de données de façon dynamique en fonction de ce que l'interface utilisateur m'envoie. Je me demande s'il est possible d'injecter dynamiquement toute une série d'arguments dans un processus stocké ... Évidemment, je sais que vous pouvez mapper des arguments individuels comme des portes =? et couleur =? et puis substituer dans les valeurs ... Mais qu'en est-il des arguments variables, presque comme Java vargs je suppose.

Vous seriez toujours en train de faire un select * from CarTb, il est juste la clause where pourrait être l'un des suivants ...

  • où les portes = 4
  • où les portes = 5 ET color = ROUGE ET MP3 = Y
  • OÙ turbo = Y OU = Y soufflé

Vous avez l'idée.

Des suggestions? Nous avons accès à hibernate si cela aide, et à la base de données sybase (ie nous pouvons écrire un autre proc stocké pour le faire si nécessaire).

--Cheers, Dave

+0

Avez-vous accès à la base de données (par exemple, pouvez-vous écrire une procédure stockée) ou êtes-vous limité à l'utilisation de Java? –

+0

Oui ... J'ai modifié la question originale pour refléter cela. – f1dave

Répondre

0

Vous pouvez construire dynamiquement votre requête, mais encore ont doors=:param. Par exemple:

if (doorsSelected) { 
    clauses.add("doors=:doors"); 
    paramNames.add("doors"); 
    values.add(doors); 
} 

if (engineSelected) { 
    clauses.add("engine=:engine"); 
    params.put("engine", engine); 
} 

Alors rejoignez simplement la liste des clauses (par exemple, en utilisant Joiner de goyave):

String queryString = Joiner.on(" AND ").join(clauses); 
Query query = session.createQuery(queryString); 

Puis itérer params et query.setParameter(key, value)

+0

Hmm ... Semble une bonne idée. Étant donné que nous pourrions avoir toutes sortes d'options (pas juste ET), n'aurions-nous pas besoin d'avoir une sorte d'analyse personnalisée pour trouver où placer l'AND, OU, NOT etc comme requis? – f1dave

+0

Eh bien, vous pouvez les rejoindre dans un 'StringBuilder' si vous le souhaitez. Ou avez des listes séparées pour andClauses, ouClauses, etc. – Bozho

0

je peux penser à une sorte de tricherie Bien que j'imagine/j'espère que la requête serait optimisée. Vous pouvez ajouter des args supplémentaires dans votre instruction préparée pour les conditions que vous souhaitez ajouter qui ne seraient vraies que si le champ était présent.

select ... 
    from ... 
    where var1=? and <expression associated with that var1> 
    or var2=? and <expression associated with that var2> 
    or etc 
Questions connexes