mam inny rodzajowe rozwiązanie, które powinno działać na każdym zapytaniu kryteria:
użyć standardowego komentarza oraz hibernacji Interceptor zmienia ostateczny SQL do bazy danych.
(Użyłem go z Hibernate 3.3, ale powinien być użyteczny dla każdej wersji, rejestracja Interceptora może być inna.)
w zapytaniu użyć kodu:
criteria.setComment("$HINT$ push_pred(viewAlias)");
napisać Interceptor, aby zmienić tekst SQL (ten wykorzystuje commons.lang3.StringUtils):
public class HibernateEntityInterceptor extends EmptyInterceptor {
@Override
public String onPrepareStatement(String sql) {
if (sql.startsWith("/* $HINT$")) {
String hintText = StringUtils.substringBetween(sql, "/* $HINT$", "*/");
sql = sql.replaceFirst("select ", "select /*+" + hintText + "*/ ");
}
return sql;
}
powyżej jest dla Oracle, ale powinien być łatwo regulowany dla każdego DBMS.
Może możesz/powinieneś utworzyć stałą dla znacznika podpowiedzi "$ HINT $".
Należy również wykonać rejestrowanie (aby można było łatwo zobaczyć poprawne wywoływanie Interceptora), zostawiłem to powyżej dla uproszczenia.
Interceptor musi być zarejestrowany. Wiosną odbywa się to w applicationContext.xml
:
<bean id="entityListener" class="your.package.HibernateEntityInterceptor"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="entityInterceptor" ref="entityListener"/>
[...]
Albo (kopia z Hibernate 3.3 docs):
Sesja o zasięgu Interceptor jest określona, gdy sesja jest otwarta stosując jeden z przeciążonej SessionFactory Metody .openSession() akceptowanie Interceptora.
Session session = sf.openSession(new HibernateEntityInterceptor());
SessionFactory o zasięgu Interceptor jest zarejestrowany w obiekcie konfiguracji sprzed budowy SessionFactory. O ile sesja nie zostanie otwarta, określając bezpośrednio używany przechwytujący, dostarczony przechwytywacz zostanie zastosowany do wszystkich sesji otwartych z tego obiektu SessionFactory o wartości . Obiekty przechwytujące SessionFactory muszą być bezpieczne dla wątku . Upewnij się, że nie przechowujesz stanów specyficznych dla sesji, ponieważ wiele sesji będzie używać jednocześnie tego obiektu przechwytującego.
new Configuration().setInterceptor(new HibernateEntityInterceptor());
wynik rzeczywiście będzie użytkownik twarzy. –
samo zapytanie jest poprawne, tak jak jest. ponieważ jest generowany dynamicznie, nie można go ręcznie zoptymalizować, jest inny w przypadku każdego zapytania wyszukiwania. –