2011-08-31 22 views
17

Hỗ trợ tiêu chí Hibernate cung cấp phương thức setMaxResults() để giới hạn kết quả được trả về từ db.Cơ chế giới hạn tiêu chuẩn Hibernate?

Tôi không thể tìm thấy bất kỳ câu trả lời nào cho tài liệu này trong tài liệu của họ - cách triển khai này được thực hiện như thế nào? Có phải truy vấn cho toàn bộ tập kết quả và sau đó chỉ trả về số yêu cầu? Hoặc là nó thực sự hạn chế truy vấn vào cuối cơ sở dữ liệu (nghĩ LIMIT từ khóa như trong mySql). Điều này quan trọng bởi vì nếu một truy vấn có khả năng có thể trả lại nhiều kết quả, tôi thực sự cần phải biết nếu setMaxResults() vẫn sẽ truy vấn tất cả các hàng trong cơ sở dữ liệu (điều này sẽ là xấu).

Ngoài ra - nếu nó thực sự hạn chế số lượng hàng trên cơ sở dữ liệu, làm cách nào để đạt được cross-db này (vì tôi không nghĩ mọi rdbms đều hỗ trợ chức năng LIMIT như mySql).

Trả lời

0

HQL không hạn chế một giới hạn bên trong truy vấn như trong SQL, chỉ có setMaxResults() mà bạn cũng tìm thấy.

Để tìm hiểu xem nó có chuyển đổi số setMaxResults() thành truy vấn LIMIT không, bạn có thể bật ghi nhật ký SQL của mình.

11

Hibernate yêu cầu cơ sở dữ liệu giới hạn kết quả được trả về bởi truy vấn. Nó thực hiện điều này thông qua phương ngữ, sử dụng bất kỳ cơ chế cơ sở dữ liệu cụ thể nào để làm điều này (vì vậy đối với SQL Server, nó sẽ làm mọi thứ như "chọn n * đầu bảng", Oracle sẽ thực hiện "select *" từ bảng nơi rownum < n ", MySQL sẽ thực hiện" chọn * từ giới hạn bảng n "v.v.). Sau đó, nó chỉ trả về những gì cơ sở dữ liệu trả về.

+0

Intersting. Sau đó, tại sao, bạn có nghĩ rằng, họ đã không cung cấp một cách để hạn chế sử dụng HQL nếu họ có thể chuyển đổi sang phương ngữ cụ thể đưa ra một tiêu chí setMaxResults? – john

+0

có một cái nhìn trong http://stackoverflow.com/questions/1239723/how-do-you-do-a-limit-query-in-hql – Ritesh

+0

điều này có thể cung cấp một số rõ ràng: http://stackoverflow.com/questions/1239723/how-do-bạn-do-a-giới hạn-truy vấn-trong-hql.Hiểu biết của tôi là nó nắm giữ để duy trì cơ sở dữ liệu phần HQL bất khả tri, các tính năng cụ thể của phương ngữ được thực hiện thông qua các cuộc gọi phương thức bổ sung như setMaxResults – brent777

2

Tôi sử dụng cả Hibernate và Hibernate Search và không nhìn vào triển khai bên dưới, tôi có thể cho bạn biết rằng chúng chắc chắn không trả lại tất cả kết quả. Tôi đã thực hiện cùng một truy vấn trả về tất cả các kết quả và sau đó thay đổi nó để thiết lập kết quả đầu tiên và kết quả tối đa (để thực hiện phân trang) và hiệu suất đạt được lớn.

Họ có thể sử dụng SQL phương ngữ cụ thể cho điều này, ví dụ: LIMIT trong MySQL, ROWNUM trong Oracle. Người quản lý thực thể của bạn biết về phương ngữ mà bạn đang sử dụng để điều này thật đơn giản.

Cuối cùng, nếu bạn thực sự muốn kiểm tra xem SQL Hibernate đang tạo ra gì cho truy vấn này, chỉ cần đặt thuộc tính "show_sql" thành true khi bạn tạo trình quản lý/nhà máy thực thể của bạn và nó phát ra tất cả SQL đang chạy đến bàn điều khiển .

5

Lớp org.hibernate.dialect.Dialect chứa phương thức được gọi là supportsLimit(). Nếu các lớp con phương ngữ ghi đè phương thức này, chúng có thể thực hiện xử lý giới hạn hàng trong một kiểu gốc với sở thích cơ sở dữ liệu của chúng. Bạn có thể thấy mã này được gọi từ đâu trong lớp org.hibernate.loader.Loader có phương thức có tiêu đề prepareQueryStatement, chỉ cần tìm kiếm từ giới hạn.

Tuy nhiên, nếu phương ngữ không hỗ trợ tính năng này, sẽ có một kiểm tra khó khăn đối với trình kiểm tra ResultSet đảm bảo kết quả đối tượng Java (thực thể) sẽ không được xây dựng khi đạt đến giới hạn. Mã này cũng nằm ở số Loader.