2012-03-13 27 views
5

Tôi đang sử dụng java/hibernate/Oracle. tôi có một danh sách với hơn 3000 mục. nếu tôi vượt qua toàn bộ danh sách tôi nhận được dưới đây ngoại lệ.Gây ra bởi: java.sql.SQLException: ORA-01795: số biểu thức tối đa trong danh sách là 1000?

Nguyên nhân: java.sql.SQLException: ORA-01.795: số lượng tối đa của biểu thức trong danh sách là 1000

để giải quyết vấn đề tôi đang tách danh sách vào danh sách phụ, mỗi sublist sẽ có 1000 mục nhập. cho mỗi nghìn mục tôi đang kích hoạt một truy vấn. nó hoạt động tốt.

Hãy làm rõ cho tôi, có giải pháp nào tốt hơn không?

Cảm ơn!

+0

ORA-01.795 là một mã lỗi Oracle, mà sẽ đề nghị rằng nó là một Oracle, thay vì Hibernate, giới hạn. –

Trả lời

7

Đây là một hạn chế của Oracle, đó là lý do nó có một mã lỗi Oracle .. Mặc dù bạn có thể cho rằng đó là một hạn chế của Hibernate mà nó không minh bạch làm việc xung quanh nó :)

Bạn nên đặt danh sách đó vào một bảng tạm thời và tham gia vào đó, giả sử Oracle không có bất cứ thứ gì như SQL Máy chủ table-valued parameters. (Hoặc bạn có thể chia truy vấn của bạn thành nhiều truy vấn, mạnh mẽ - nó phụ thuộc vào những gì bạn đang làm.)

+0

+1 cho workaround :) Ngoài ra: Một tìm kiếm google nhanh chóng cho thấy nhiều bài viết của ppl với cùng một vấn đề - vì vậy có thể đã có một số cách tiếp cận khắc phục hạn chế này ... – quaylar

1

Các ngoại lệ-Text cho phép tôi tin rằng điều này là đến từ Oracle-Database - nhìn vào lỗi số ...

0

cũng có một cách khác để giải quyết vấn đề này. cho phép nói rằng bạn có hai bảng Table1 và Table2. và nó được yêu cầu để lấy tất cả các mục của Table1 không được giới thiệu/hiện diện trong Table2 bằng cách sử dụng truy vấn Criteria. Vì vậy, đi về phía trước như thế này ...

List list=new ArrayList(); 
Criteria cr=session.createCriteria(Table1.class); 
cr.add(Restrictions.sqlRestriction("this_.id not in (select t2.t1_id from Table2 t2)")); 
. 
. 





List list=new ArrayList(); 
Criteria cr=session.createCriteria(Table1.class); 
cr.add(Restrictions.sqlRestriction("this_.id not in (select t2.t1_id from Table2 t2)")); 
list=cr.list(); 
. 
. 
. 

Nó sẽ thực hiện tất cả các finction subquery trực tiếp trong SQL mà không bao gồm 1000 hoặc nhiều tham số trong SQL chuyển đổi bởi khuôn khổ Hibernate. Nó làm việc cho tôi. Lưu ý: Bạn có thể cần phải thay đổi phần SQL theo yêu cầu của bạn.

+1

hãy chắc chắn để đọc trợ giúp định dạng:) – kleopatra

+0

@kleopatra, cảm ơn bạn đã chỉ ra :-) Tôi đã chỉnh sửa nó –

0

Bạn không thể có danh sách có hơn 1000 thành phần trong một điều kiện "ở đâu" nếu bạn đang làm việc với Oracle DB. Vì vậy, bạn có thể cắt xuống điều kiện "ở đâu" của bạn trong nhiều điều kiện "ở đâu" và kết hợp chúng với mệnh đề "hoặc".

Nếu bạn đang sử dụng Tiêu chuẩn ngủ đông, bạn có thể sử dụng phương pháp Java bên dưới để thực hiện việc này. Chỉ cần thay thế mã của bạn có bao giờ bạn sử dụng

criteria.add(Restrictions.in(propertyName, mainList)); 

với

addCriteriaIn(propertyName, mainList, criteria); 

mà phương pháp này là:

private void addCriteriaIn (String propertyName, List<?> list,Criteria criteria) 
    { 
    Disjunction or = Restrictions.disjunction(); 
    if(list.size()>1000) 
    {   
     while(list.size()>1000) 
     { 
     List<?> subList = list.subList(0, 1000); 
     or.add(Restrictions.in(propertyName, subList)); 
     list.subList(0, 1000).clear(); 
     } 
    } 
    or.add(Restrictions.in(propertyName, list)); 
    criteria.add(or); 
    } 
Các vấn đề liên quan