2013-01-16 34 views
6

Tôi sử dụng đặc tả JPA và Hibernate làm nhà cung cấp của mình. Tôi cần bằng cách nào đó để có được truy vấn SQL được tạo ra được gửi đến DB (in ra sysout) và lưu nó như là một chuỗi đơn giản.Cách nhận truy vấn SQL do JPA tạo ra?

Có cách nào để thực hiện việc này không?

EDIT

Hãy để tôi làm cho nó rõ ràng hơn một nhịp: Tôi không cần ngủ đông log. Tôi cần để có thể thực hiện cùng một truy vấn trên một DB khác nhau. Vì vậy, tôi cần phải nhận được truy vấn SQL như là, và giữ nó trong một biến String bình thường.

Chỉnh sửa 2

Có util mà tôi có thể cung cấp cho nó một bean và nó sẽ tự động tạo ra một truy vấn Insert? bằng cách nào đó tôi có thể sử dụng đậu Hibernate ở đây? Tôi biết đó là một nhịp phức tạp.

Cảm ơn,

Idob

+0

Sửa bạn thắc mắc, nó không hoàn toàn rõ ràng rằng bạn hỏi về mùa xuân module dữ liệu JPA, mùa xuân có thể sử dụng JPA không có dữ liệu mùa xuân – Alexandr

+0

bạn đã tìm thấy giải pháp chưa ? – user1537766

+0

Nó không giống như có một giải pháp sạch đẹp. Bạn có thể truyền EntityManager vào việc thực hiện Đặc tả thông qua một tham số và sau đó sử dụng mã được tìm thấy ở đây https://antoniogoncalves.org/2012/05/24/how-to-get-the-jpqlsql-string-from- a-criteriaquery-in-jpa/ – user1567291

Trả lời

1

Bạn phải kích hoạt logging log4j và thêm một appender cho Hibernate để hiển thị các truy vấn.

này đã được mô tả ở đây: How to print a query string with parameter values when using Hibernate

+0

Đây không phải là những gì tôi đã hỏi !. –

+0

Tôi cần nhận truy vấn dưới dạng chuỗi để sử dụng sau này. không xem nó trong nhật ký. –

1

Câu trả lời đơn giản cho câu hỏi của bạn là số gì bạn muốn làm là điều mà nhiều nhà phát triển cũng muốn làm tuy nhiên nó không phải là một phần của đặc tả JPA và do đó khả năng để có được SQL được tạo ra sẽ phụ thuộc vào những gì nhà cung cấp đã quyết định làm. Sử dụng Hibernate cách duy nhất để có được SQL là thông qua nhật ký.

10

Tạo một hạt giống như thế này.

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

    return jpaVendorAdapter; 
} 

Nếu bạn đang sử dụng Khởi động mùa xuân, hãy thêm nó vào đâu đó vào @Configuration của bạn.

Các nhật ký được tạo từ đây được thực thi trong bàn làm việc MySQL. Bạn đã nói rằng bạn đang sử dụng JPA và Hibernate. Không có cách nào khác ngoại trừ nếu cơ sở dữ liệu bạn hỗ trợ được hỗ trợ bởi JPA. Trong trường hợp đó, có một AbstractJpaVendorAdapter mà bạn có thể thực hiện.

+0

Tuyệt. Có thể thấy câu lệnh sql trong bảng điều khiển của tôi :) – Arundev

0

Cố gắng thêm các thuộc tính trong trường hợp của LocalContainerEntityManagerFactoryBean, làm việc của nó cho tôi: -

@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; 
    } 
} 
Các vấn đề liên quan