[Hibernate] Hibernate native SQL queries

Trong Hibernate, HQL hoặc criteria queries sẽ có thể cho phép bạn thực hiện hầu hết mọi truy vấn SQL. Tuy nhiên, nhiều developer phàn nàn về lệnh SQL được Hibernate tạo ra chậm và thích tự tạo lệnh SQL (native SQL) của riêng họ hơn.

Native SQL queries
Hibernate cung cấp phương thức createQueryQuery để cho phép chạy trực tiếp câu native SQL.

1. Trong ví dụ này, yêu cầu Hibernate trả ra 1 Stock.class, tất cả dữ liệu trong select ( *) sẽ tự động khớp với các property Stock.class.

Java:
Query query = session.createSQLQuery(
"select * from stock s where s.stock_code = :stockCode")
.addEntity(Stock.class)
.setParameter("stockCode", "7277");
List result = query.list();
2. Trong ví dụ này, Hibernate sẽ trả về Object array.

Java:
Query query = session.createSQLQuery(
"select s.stock_code from stock s where s.stock_code = :stockCode")
.setParameter("stockCode", "7277");
List result = query.list();
Thay thế, cũng có thể sử dụng named query để gọi native SQL. Xem tại Hibernate named query.


SQL được Hibernate generate chậm!?
Tôi không đồng ý với ý kiến "SQL được Hibernate generate chậm". Thông thường, tôi phát hiện ra điều này là do các developer không hiểu rõ mối quan hệ giữa các bảng và đã thực hiện một số mapping sai hoặc sử dụng sai fetch strategy. Nó sẽ khiến Hibernate tạo ra một số câu lệnh SQL không cần thiết hoặc join một số bảng không cần thiết. Và các developer muốn lấy lý do này vàtự tạo lệnh SQL của riêng họ để khắc phục nhanh lỗi và không nhận thức được vấn đề cốt lõi sẽ gây ra nhiều lỗi hơn.


Kết luận
Phải thừa nhận đôi khi lệnh native SQL thực sự tiện lợi và dễ dàng hơn sử dụng HQL, nhưng, hãy suy nghĩ cẩn thận tại sao bạn cần một câu native SQL? Có phải thực sự là Hibernate không thể làm điều đó? Nếu có, thì hãy tiếp tục ~

P.S Với Oracle database, tôi thích sử dụng native SQL hơn trong nhiều truy vấn liên quan đến performance, bởi vì tôi cần đặt "hint" để cải thiện query performance của Oracle.


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :D

Bài viết tham khảo tại: https://mkyong.com/hibernate/hibernate-native-sql-queries-examples/
 
Sửa lần cuối:

Bình luận