2013-08-22 32 views
12

Tôi đang thực hiện các HQL sau đây và nó được thực hiện đúng cáchChuyển đổi HQL to SQL Query mà không hibernate_show_sql = true

String hql = "FROM Employee"; 
Query query = session.createQuery(hql); 
List results = query.list(); 

Bây giờ tôi cũng muốn ghi lại những sql tạo tại backend trong nhật ký cho người dùng hỗ trợ, tôi muốn để sử dụng QueryTranslator xin vui lòng tư vấn làm thế nào tôi có thể tạo sql cho HQL tương ứng xin vui lòng tư vấn làm thế nào để đạt được điều này.

Trả lời

3

bạn có thể truy vấn bằng cách sử dụng phương pháp unwrap.

String queryString = query.unwrap(org.hibernate.Query.class).getQueryString(); 
+4

phiên bản hibernate nào có truy vấn bằng phương pháp không mong muốn? – Jewels

+0

một phần của java6 persistence api https://docs.oracle.com/javaee/6/api/javax/persistence/Query.html –

+0

Điều này chỉ hoạt động để có được truy vấn HQL và không phải truy vấn SQL – Ben

2

Bạn có thể sử dụng hibernate QueryTranslator:

String hqlQueryString = hqlQuery.getQueryString(); 
ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory(); 
SessionImplementor hibernateSession = entityManager.unwrap(SessionImplementor.class); 
QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator("", hqlQueryString, java.util.Collections.EMPTY_MAP, hibernateSession.getFactory()); 
queryTranslator.compile(java.util.Collections.EMPTY_MAP, false); 
String sqlQueryString = queryTranslator.getSQLString(); 
+2

Thật không may điều này không hoạt động cho Hibernate 5: (Có tham số thứ 5 mới 'EntityGraphQueryHint'. –

+0

bạn có thể vượt qua null như tham số thứ 5. Nó sẽ làm việc. – user2700896

+0

Điều này chỉ trả về hql không sql, câu hỏi là:" Bây giờ tôi cũng muốn đăng nhập sql được tạo ra tại backend trong nhật ký cho người dùng hỗ trợ " – Ben

0

tôi tìm thấy giải pháp tiếp theo trên web:

QueryTranslatorFactory translatorFactory = new ASTQueryTranslatorFactory(); 
SessionFactoryImplementor factory = (SessionFactoryImplementor) getSessionFactory(); 
QueryTranslator translator = translatorFactory. 
     createQueryTranslator(hqlQueryText, hqlQueryText, Collections.EMPTY_MAP, factory); 
translator.compile(Collections.EMPTY_MAP, false); 
translator.getSQLString(); 

Nguồn: http://narcanti.keyboardsamurais.de/hibernate-hql-to-sql-translation.html

0

Tôi tin rằng bạn muốn có một sự kết hợp của trên cùng 2 câu trả lời

String hqlQueryString = query.unwrap(org.hibernate.Query.class).getQueryString(); 
    ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory(); 
    SessionImplementor hibernateSession = em.unwrap(SessionImplementor.class); 
    QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator("", hqlQueryString, java.util.Collections.EMPTY_MAP, hibernateSession.getFactory()); 
    queryTranslator.compile(java.util.Collections.EMPTY_MAP, false); 
    String sqlQueryString = queryTranslator.getSQLString();