Wie binden Sie Oracle-Hinweise in die Hibernate-Abfrage

Einbetten von Oracle-Hinweisen in die Ruhezustandsabfrage

Mit Oracle-Hinweisen können Sie die Oracle-Ausführungspläne ändern, um die Art und Weise zu beeinflussen, wie Oracle die Daten aus der Datenbank abruft. Weitere Informationen zuOracle optimizer hints finden Sie hier.

Ist es im Ruhezustand möglich, den Oracle-Hinweis in die Ruhezustandsabfrage einzubetten?

Ruhezustand einstellenKommentar ()?

Können Sie den Oracle-Hinweis mit der Funktion "setComment()" für benutzerdefinierte Kommentare im Ruhezustand in HQL einbetten? Sehen wir uns hier ein Beispiel an

1. Ursprüngliche Ruhezustand-Abfrage

Dies ist eine einfache Auswahl-HQL, um einen Bestand mit einem Bestandscode abzurufen.

String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setString("stockCode", "7277")
.list();

Ausgabe

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. Versuchen Sie es mit Hibernate setComment ()

Aktivieren Siehibernate.use_sql_comments in der Konfigurationsdatei von Hibernate (hibernate.cfg.xml), um den benutzerdefinierten Kommentar in Ihre Protokolldatei oder Konsole auszugeben.



...

 
    ...
    true
    true
    true
    
  

Verwenden von HibernatesetComment(), um einen benutzerdefinierten Kommentar in Ihre Abfrage einzufügen.

String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setString("stockCode", "7277")
.setComment("+ INDEX(stock idx_stock_code)")
.list();

Ausgabe

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. Ist das Arbeit?

Es gibt zwei Probleme mit benutzerdefinierten Kommentaren im Ruhezustand.

1. Der Oracle-Hinweis muss nach dem 'select' angefügt werden, nicht davor.

In den Ruhezustand versetzte Abfrage

 /* + INDEX(stock idx_stock_code) */ select

Der richtige Weg sollte sein ...

select  /*+ INDEX(stock idx_stock_code) */

2. Im Ruhezustand wird automatisch ein zusätzliches Leerzeichen zwischen „/ * +“ eingefügt.

In Hibernate gibt es noch keine offizielle Möglichkeit, die Oracle-Hinweise in Hibernate-Abfragesprachen (HQL) einzubetten.

P.S Thanks Pete contribute on this.

Funktionierende Lösung

Die einzige Lösung besteht darin, die native SQL-Anweisung mit der Methode HibernatecreateSQLQueryauszuführen.

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();

Ausgabe

Hibernate:
    /*+ INDEX(stock idx_stock_code) */ select *
    from stock s where s.stock_code = ?