2013-01-16 10 views
6

Uso la specifica JPA e Hibernate come fornitore. Ho bisogno in qualche modo di prendere la query SQL generata che viene inviata al DB (stampata sul sysout) e salvarla come una semplice stringa.Come ottenere la query SQL generata da JPA?

C'è un modo per farlo?

EDIT

Vorrei che fosse un colpo più chiaro: non ho bisogno di registro di ibernazione. Devo essere in grado di eseguire la stessa query su un DB diverso. Pertanto, ho bisogno di ottenere la query SQL così com'è e tenerla in una normale variabile String.

Edit 2

C'è un util cui posso fornire un fagiolo e genererà automaticamente una query di inserimento? posso usare in qualche modo i fagioli di ibernazione qui? So che è un complesso di battute.

Grazie,

Idob

+0

Edit si domanda, non è del tutto chiaro che si chiede circa modulo dati JPA primavera, la primavera può utilizzare JPA senza dati di primavera – Alexandr

+0

hai trovato una soluzione a questo? – user1537766

+0

Non sembra che ci sia una bella soluzione pulita. Potresti essere in grado di passare EntityManager all'implementazione Specificazione tramite un parametro e quindi utilizzare il codice trovato qui https://antoniogoncalves.org/2012/05/24/how-to-get-the-jpqlsql-string-from- a-criteriaquery-in-jpa/ – user1567291

risposta

1

La semplice risposta alla tua domanda è No. Che cosa si vuole fare è qualcosa che molti sviluppatori vorrebbero anche a che fare tuttavia non era parte della specifica JPA e quindi la possibilità di ottenere l'SQL generato dipenderà da ciò che il fornitore ha deciso di fare. Usando Hibernate l'unico modo per ottenere l'SQL è tramite il log.

10

Creare un bean come questo.

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

    return jpaVendorAdapter; 
} 

Se si utilizza Spring Boot, aggiungerlo da qualche parte alla configurazione @.

I registri creati da questo sono eseguibili nel workbench MySQL. Hai dichiarato che stai usando JPA e Hibernate. Non c'è altro modo, tranne se il database che supportate è supportato da JPA. In tal caso c'è un AbstractJpaVendorAdapter che puoi implementare.

+0

Fresco. In grado di vedere l'istruzione sql nella mia console :) – Arundev

0

provare ad aggiungere immobili a istanza di LocalContainerEntityManagerFactoryBean, il suo lavoro per me: -

@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; 
    } 
} 
Problemi correlati