2010-03-03 45 views
23

Tôi muốn xuất SQL được tạo ra bởi EclipseLink vào bàn điều khiển, trong quá trình phát triển. Tuy nhiên, tôi chỉ có thể làm như vậy bằng cách sử dụng mức độ đăng nhập FINE. Tôi có một mô hình miền phức tạp gồm nhiều lớp, rất nhiều việc triển khai mất một lượng thời gian đáng kể khi độ dài log ở mức FINE, vì EclipseLink đưa ra kết quả phân tích toàn bộ mô hình của nó.Có thể tạo ra SQL được tạo ra bằng EclipseLink mà không cần phải tăng độ dài log?

Có cách nào để lấy SQL mà không cần sử dụng để đăng nhập cấp FINE (như Hibernate không)?

Trả lời

43

Đặt các thuộc tính sau trong persistence.xml của bạn:

<property name="eclipselink.logging.level.sql" value="FINE"/> 
<property name="eclipselink.logging.parameters" value="true"/> 

Sau đó là hữu ích, do đó các giá trị của tham số được hiển thị.

Cách khác là sử dụng log4jdbc hoặc log4jdbc-remix.

17

Tạo nhật ký cho EclipseLink có vẻ khá khó thiết lập, theo this thread.

Nó đề cập đến một tập tin persistence.xml với mức độ đăng nhập bạn có thể thích ứng:

<property name="eclipselink.weaving" value="static" /> 
<property name="eclipselink.logging.level.sql" value="FINEST" /> 
<property name="eclipselink.logging.level" value="FINEST" /> 
<property name="eclipselink.logging.level.cache" value="FINEST" /> 

Nhưng một số thiết lập khác có thể cần thiết.

Martin tài liệu below, "EclipseLink/Examples/JPA/Logging" ghi lại các thuộc tính đó.

+2

Vâng, nó hoạt động. Cảm ơn rất nhiều! Câu hỏi mới bây giờ là - tại sao nó không được ghi lại ở đâu đó? Và nếu có, tại sao điều này không dễ tìm? ;) – javabeats

+0

@javabeats Tài liệu có thể được tìm thấy trong [EclipseLink Wiki] (https://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging) (kết quả đầu tiên khi tìm kiếm 'EclipseLink logging' ở đó). – Martin

+0

@Martin Cảm ơn bạn. Tôi đã bao gồm bình luận của bạn trong câu trả lời cho khả năng hiển thị nhiều hơn. – VonC

6

Để lấy SQL cho một truy vấn cụ thể trong thời gian chạy, bạn có thể sử dụng API DatabaseQuery.

Query query = em.createNamedQuery("findMe"); 
Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord()); 

String sqlString = databaseQuery.getSQLString(); 

SQL này sẽ chứa? cho các tham số. Để có được SQL dịch với các đối số bạn cần một DatabaseRecord với các giá trị tham số.

DatabaseRecord recordWithValues= new DatabaseRecord(); 
recordWithValues.add(new DatabaseField("param1"), "someValue"); 

String sqlStringWithArgs = 
     databaseQuery.getTranslatedSQLString(session, recordWithValues); 

Nguồn: How to get the SQL for a Query

+1

Rất hữu ích. Thiết lập liên kết nhật thực để đăng nhập tất cả là một thư rác lớn. Điều này có thể dễ dàng được đưa vào một lớp Utility và được sử dụng với độ chính xác để chỉ đăng nhập SQL ở nơi thú vị. Ví dụ. nơi cố gắng tìm các chỉ mục SQL thích hợp để tạo và không có nơi nào khác. Cảm ơn. – 99Sono

Các vấn đề liên quan