2010-05-11 32 views
18

tôi không thể tìm ra cách để lấy hàng n ngẫu nhiên từ một trường hợp tiêu chí:Hibernate Tiêu chuẩn API: lấy n hàng ngẫu nhiên

Criteria criteria = session.createCriteria(Table.class); 
criteria.add(Restrictions.eq('fieldVariable', anyValue)); 
... 

Sau đó những gì? Tôi không thể tìm thấy bất kỳ tài liệu nào có API tiêu chí

Điều đó có nghĩa là tôi nên sử dụng HQL thay thế không?

Thanx!

EDIT: Tôi nhận được số hàng bằng cách:

int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult(); 

Làm thế nào để lấy hàng n ngẫu nhiên với chỉ số giữa 0 và max? Thx lần nữa!

Trả lời

43

Thực tế có thể với Tiêu chí và một chút tinh chỉnh.Dưới đây là cách thực hiện:

Criteria criteria = session.createCriteria(Table.class); 
criteria.add(Restrictions.eq('fieldVariable', anyValue)); 
criteria.add(Restrictions.sqlRestriction("1=1 order by rand()")); 
criteria.setMaxResults(5); 
return criteria.list(); 

mọi Restrictions.sqlRestriction sẽ thêm từ khóa 'và'; do đó, để vô hiệu hóa hiệu ứng của nó, chúng ta sẽ thêm một điều kiện giả và chèn hàm rand() của chúng ta.

+1

Đó là thuận tiện và giúp tôi! – Nischal

+1

Nó không trả về các bản ghi duy nhất ... – Imran

+2

Mục đích của 1 = 1 trong giới hạn sql là gì. Tôi nhận được sản lượng phù hợp với nó, và nếu không có điều này tôi nhận được một lỗi –

0

Bạn không thể tìm nạp các hàng ngẫu nhiên một cách hiệu quả, xin lỗi. Hibernate chỉ có thể làm những gì SQL làm, và lấy hàng ngẫu nhiên chỉ đơn giản là không phải là một phần của bất kỳ SQL thực hiện tiêu chuẩn tôi biết - thực sự nó là kiến ​​thức của tôi không phải là một phần của bất kỳ SQL mà tôi biết (ai vui lòng enlight tôi).

Và như Hibernate là một trình ánh xạ O/R, và không phải là một máy lạ, nó chỉ có thể làm những gì cơ sở dữ liệu bên dưới hỗ trợ.

Nếu bạn có một tài liệu đã biết với số tăng dần và biết bắt đầu và kết thúc, bạn có thể tạo một số ngẫu nhiên trên máy tính và yêu cầu hàng đó.

+0

Đây là những cân nhắc tuyệt vời, mặc dù hiệu quả không phải là mối quan tâm hàng đầu của ông. – fabspro

+0

Mysql thực hiện lệnh rand() –

1

API tiêu chí không cung cấp cơ sở cho việc này. Tuy nhiên, trong MySQL, bạn có thể sử dụng ORDER BY RAND() LIMIT n cho điều này trong đó n thể hiện số hàng ngẫu nhiên bạn muốn tìm nạp.

SELECT col1, col2, col3 FROM tbl ORDER BY RAND() LIMIT :n 

Bạn thực sự cần thực thi nó như HQL.

6

Trước hết, hãy lưu ý rằng không có cách tiêu chuẩn để thực hiện điều này trong SQL, mỗi công cụ cơ sở dữ liệu sử dụng cú pháp độc quyền riêng của mình . Với MySQL, các câu lệnh SQL để có được 5 hàng ngẫu nhiên sẽ là:

SELECT column FROM table 
ORDER BY RAND() 
LIMIT 5 

Và bạn có thể viết truy vấn này trong HQL vì trình tự quy định tại khoản trong HQL được truyền thông qua cơ sở dữ liệu vì vậy bạn có thể sử dụng bất kỳ chức năng .

String query = "SELECT e.attribute FROM MyEntity e ORDER BY RAND()"; 
Query q = em.createQuery(query); 
q.setMaxResults(5); 

Tuy nhiên, không giống như HQL, API Tiêu chuẩn hiện không hỗ trợ ORDER BY Native SQL (xem HHH-2381) và trong tình trạng hiện nay, bạn sẽ phải phân lớp lớp Order để thực hiện tính năng này. Điều này có thể thực hiện được, hãy tham khảo vấn đề Jira, nhưng không có sẵn trong hộp.

Vì vậy, nếu thực sự bạn cần truy vấn này, đề xuất của tôi sẽ là sử dụng HQL. Chỉ cần ghi nhớ nó sẽ không được di động.

Người đọc khác có thể muốn kiểm tra bài đăng SQL to Select a random row from a database table để xem cách triển khai điều này với MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2 và Oracle.

+0

Hibernate nói với tôi rằng không có chức năng nào như "RAND", sử dụng pg @ java7, hmm ... những gì didi sai? -> ngẫu nhiên của nó() trong trường hợp của pg, xin lỗi bận tâm – Chris

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