2013-01-16 5 views
6

Ich verwende JPA-Spezifikation und Hibernate als meinen Lieferanten. Ich muss irgendwie die erzeugte SQL-Abfrage, die an die DB gesendet wird (gedruckt an die SYSOUT), und sie als eine einfache Zeichenfolge speichern.Wie bekomme ich die JPA generierte SQL Abfrage?

Gibt es eine Möglichkeit, dies zu tun?

EDIT

mich Lassen Sie machen ein Beat deutlicher: Ich Hibernate Protokoll nicht brauchen. Ich muss in der Lage sein, dieselbe Abfrage in einer anderen Datenbank auszuführen. Daher muss ich die SQL-Abfrage so erhalten, wie sie ist, und sie in einer normalen String-Variablen speichern.

Edit 2

Gibt es eine util, das ich ihm eine Bohne zur Verfügung stellen kann, und es wird eine INSERT-Abfrage automatisch generieren? kann ich hier irgendwie Hibernate-Bohnen verwenden? Ich weiß, es ist ein Beat-Komplex.

Danke,

Idob

+0

Frage bearbeiten Sie, es ist nicht ganz klar, dass man über Federdaten JPA Modul fragen, Feder – Alexandr

+0

JPA ohne Feder Daten verwenden können, hast du eine lösung dafür gefunden? – user1537766

+0

Es sieht nicht so aus, als gäbe es eine schöne, saubere Lösung. Sie können den EntityManager möglicherweise über einen Parameter in die Spezifikation implementieren und dann den hier gefundenen Code verwenden https://antoniogoncalves.org/2012/05/24/how-to-get-the-jpqlsql-string-from- a-criteriaquery-in-jpa/ – user1567291

Antwort

1

Sie haben die log4j Protokollierung aktivieren und eine appender für Hibernate fügen Sie die Abfragen zu zeigen.

Dies wurde bereits hier beschrieben: How to print a query string with parameter values when using Hibernate

+0

Das habe ich nicht gefragt! –

+0

Ich muss die Abfrage als Zeichenfolge für die spätere Verwendung abrufen. nicht in einem Protokoll anzeigen. –

1

Die einfache Antwort auf Ihre Frage ist Nein. Was Sie tun möchten, ist etwas, das viele Entwickler auch war es aber tun möchte nicht Teil der JPA-Spezifikation und Daher hängt die Fähigkeit, das generierte SQL zu erhalten, davon ab, was der Anbieter entschieden hat. Wenn Sie Hibernate verwenden, können Sie SQL nur über das Protokoll abrufen.

10

Erstellen Sie eine Bean wie folgt.

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

    return jpaVendorAdapter; 
} 

Wenn Sie Spring Boot verwenden, fügen Sie es irgendwo zu Ihrer @Configuration hinzu.

Die daraus erstellten Protokolle sind in MySQL Workbench ausführbar. Sie haben angegeben, dass Sie JPA und Hibernate verwenden. Es gibt keinen anderen Weg, außer wenn die von Ihnen unterstützte Datenbank von JPA unterstützt wird. In diesem Fall gibt es einen AbstractJpaVendorAdapter, den Sie implementieren können.

+0

Kühl. Kann die sql-Anweisung in meiner Konsole sehen :) – Arundev

0

Versuchen Immobilien Instanz von LocalContainerEntityManagerFactoryBean, seine Arbeits für mich hinzuzufügen: -

@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; 
    } 
} 
Verwandte Themen