Comment incorporer des conseils Oracle dans une requête Hibernate
Avec les conseils Oracle, vous pouvez modifier les plans d'exécution Oracle pour affecter la façon dont Oracle récupère les données de la base de données. Allez ici pour plus de détails surOracle optimizer hints.
Dans Hibernate, est-il possible d'incorporer l'indicateur Oracle dans la requête Hibernate?
Hibernate setComment ()?
Pouvez-vous intégrer l'indice Oracle dans HQL avec la fonction de commentaire personnalisé «setComment()» d'Hibernate? Voyons un exemple ici
1. Requête Hibernate d'origine
Il s'agit d'un simple HQL de sélection pour récupérer un stock avec un code stock.
String hql = "from Stock s where s.stockCode = :stockCode"; List result = session.createQuery(hql) .setString("stockCode", "7277") .list();
Sortie
Hibernate: select stock0_.STOCK_ID as STOCK1_0_, stock0_.STOCK_CODE as STOCK2_0_, stock0_.STOCK_NAME as STOCK3_0_ from example.stock stock0_ where stock0_.STOCK_CODE=?
2. Essayez Hibernate setComment ()
Activez leshibernate.use_sql_comments dans le fichier de configuration d'Hibernate (hibernate.cfg.xml) afin de générer le commentaire personnalisé dans votre fichier journal ou votre console.
...... true true true
Utilisation de HibernatesetComment() pour insérer un commentaire personnalisé dans votre requête.
String hql = "from Stock s where s.stockCode = :stockCode"; List result = session.createQuery(hql) .setString("stockCode", "7277") .setComment("+ INDEX(stock idx_stock_code)") .list();
Sortie
Hibernate: /* + INDEX(stock idx_stock_code) */ select stock0_.STOCK_ID as STOCK1_0_, stock0_.STOCK_CODE as STOCK2_0_, stock0_.STOCK_NAME as STOCK3_0_ from example.stock stock0_ where stock0_.STOCK_CODE=?
3. C'est du travail?
Non, il y a deux problèmes avec les commentaires personnalisés Hibernate.
1. L'indice Oracle doit être ajouté après la «sélection», pas avant.
Mise en veille prolongée générée
/* + INDEX(stock idx_stock_code) */ select
La bonne façon devrait être…
select /*+ INDEX(stock idx_stock_code) */
2. Hibernate ajoutera automatiquement un espace supplémentaire entre «/ * +».
Dans Hibernate, il n'y a toujours aucun moyen officiel d'intégrer les conseils Oracle dans les langues de requête Hibernate (HQL).
P.S Thanks Pete contribute on this.
Solution de travail
La seule solution consiste à utiliser la méthode HibernatecreateSQLQuery pour exécuter l'instruction SQL native.
String hql = "/*+ INDEX(stock idx_stock_code) */ select * from stock s where s.stock_code = :stockCode"; List result = session.createQuery(hql) .setString("stockCode", "7277") .list();
sortie
Hibernate: /*+ INDEX(stock idx_stock_code) */ select * from stock s where s.stock_code = ?
Plus deNative SQL queries examples.