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