Comment intégrer des astuces Oracle dans une requête Hibernate

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 = ?