Évidemment, la requête de modèle Hibernate injecte le paramètre de chaîne "Tablename" dans la requête avec des guillemets. Qui causera des erreurs SQL Grammar Syntaxe.
Comment ajouter le nom de la table comme l'un des paramètres de la requête? p>
Par exemple, le code suivant ne fonctionnera pas à cause du nom de la table: P>
SQLQuery query = session.createSQLQuery("SELECT ID FROM :tableName");
query.setFlushMode(FlushMode.MANUAL);
query.setReadOnly(true);
query.setParameter("tableName", "STUDENT");
List<Object[]> list = query.list();
3 Réponses :
Votre requête HQL devrait ressembler à ceci:
select id,username from Conversation where id=1000;
Les noms de table ne peuvent pas être paramétrés dans les requêtes.
Ce que vous voulez réellement atteindre consiste à construire une chaîne code> code> qui sera utilisée pour construire la requête: p> L'absence de capacité à paramétrer les noms de table n'a rien à voir avec Hibernate - les bases de données ne le supportent pas. Et cela n'aurait aucun sens de le soutenir. P> Les variables de liaison existent principalement pour des raisons de performance. Le point est que vous envoyez une requête à la base de données (via JDBC pilote) avec les espaces réservés pour les variables qui changeront entre les invocations de la même requête em> p> La base de données analysera cette requête, calculez le coût pour cela, effectuez un plan d'exécution et mettez-le en cache. Les invocations ultérieures de la requête seront beaucoup plus rapides, car toutes ces étapes sont ignorées et le Plan d'exécution en cache est utilisé. p> Comment la base de données pourrait-elle cacher l'instruction et le plan d'exécution si le nom de la table est inconnu (paramétré)? Cela ne saurait pas le coût et le chemin optimal pour aller chercher les données s'il ne sait pas où aller les données de. P> En outre, la base de données ne pourra pas valider complètement la requête lorsqu'elle l'analyse Ne sait pas si les colonnes référencées existent réellement dans le tableau (qui seraient inconnues à l'heure d'analyse de la déclaration si les noms de table étaient paramétrés). P> P>
C'est ce que je fais ce que je fais, mais je ne comprends toujours pas pourquoi n'empêchez pas les noms de table paramétrant. :)
Cette réponse peut entraîner une injection SQL, un trou de sécurité très facile à manipuler. C'est aussi pourquoi les paramètres ne peuvent pas être utilisés pour les noms de table.
Query query = session.createQuery(String.format("select id from %s", "Student"));
it's same thing as first answer (but using some Java help): You need to construct a String to pass as query