2013-01-16 16 views
6

Używam specyfikacji JPA i Hibernate jako mojego dostawcy. Potrzebuję jakoś pobrać wygenerowane zapytanie SQL, które jest wysyłane do DB (drukowane do sysout) i zapisywać jako prosty ciąg.Jak uzyskać wygenerowane zapytanie JPA?

Czy istnieje sposób, aby to zrobić?

EDIT

Pozwól mi zrobić to bicie jaśniej: nie muszę hibernacji dziennik. Muszę być w stanie wykonać to samo zapytanie na innym DB. Dlatego muszę uzyskać zapytanie SQL w niezmienionej postaci i przytrzymać je w normalnej zmiennej String.

Edycja 2

Czy istnieje util które mogę zapewnić mu fasolkę i automatycznie generuje INSERT? czy mogę w jakiś sposób użyć fasoli Hibernate? Wiem, że to kompleks bitów.

Dzięki,

Idob

+0

Edit kwestionujesz, to nie jest całkiem jasne, że pytasz o wiosennym module JPA dane, wiosna może użyć WZP bez danych wiosennych – Alexandr

+0

znalazłeś rozwiązanie tego? – user1537766

+0

To nie wygląda na ładne, czyste rozwiązanie. Możesz być w stanie przekazać EntityManager do implementacji Specyfikacji za pomocą parametru, a następnie użyć kodu znajdującego się tutaj https://antoniogoncalves.org/2012/05/24/how-to-get-the-jpqlsql-string-from- a-criteriaquery-in-jpa/ – user1567291

Odpowiedz

1

Prosta odpowiedź na to pytanie jest nr Co chcesz zrobić coś, że wielu deweloperów pragnie również zrobić jednak nie było częścią specyfikacji JPA i w ten sposób możliwość uzyskania wygenerowanego SQL będzie zależeć od tego, co postanowił zrobić sprzedawca. Korzystanie z trybu hibernacji to jedyny sposób uzyskania kodu SQL za pośrednictwem dziennika.

10

Utwórz taką fasolę.

@Bean 
public JpaVendorAdapter jpaVendorAdapter(){ 
    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
    jpaVendorAdapter.setGenerateDdl(true); 
    jpaVendorAdapter.setShowSql(true); 

    return jpaVendorAdapter; 
} 

Jeśli używasz Spring Boot dodaj go gdzieś do swojej @Configuration.

Utworzone z niego logi są wykonywalne w środowisku roboczym MySQL. Podałeś, że używasz JPA i Hibernate. Nie ma innej drogi, chyba że obsługiwana baza danych jest obsługiwana przez WZP. W takim przypadku istnieje narzędzie AbstractJpaVendorAdapter, które można zaimplementować.

+0

Cool. Potrafię zobaczyć instrukcję sql w mojej konsoli :) – Arundev

0

Spróbuj dodać właściwości w instancji LocalContainerEntityManagerFactoryBean, jego pracy dla mnie: -

@EnableJpaRepositories(basePackages = "org.common.persistence.dao") 
public class PersistenceJPAConfig { 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan(new String[] { "org.common.persistence.model" }); 
     final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(additionalProperties()); 
     return em; 
    } 

    final Properties additionalProperties() { 
     final Properties hibernateProperties = new Properties(); 
     hibernateProperties.setProperty("showSql", "true"); 
     hibernateProperties.setProperty("hibernate.show_sql", "true"); 
     hibernateProperties.setProperty("hibernate.format_sql", "true"); 
     hibernateProperties.setProperty("hibernate.query.substitutions", "false"); 
     return hibernateProperties; 
    } 
} 
Powiązane problemy