[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-1123) Cannot put more than 1000 elements in a InExpression

Shyamsunder (JIRA) noreply at atlassian.com
Fri Jan 18 13:54:56 EST 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_29378 ] 

Shyamsunder commented on HHH-1123:
----------------------------------

I have faced the same issue in my project.  After failed trails to find a suitable solution, I have written the method addRestrictions(). This method divides the List of values into sublists with size<=1000. It creates LogicalExpression using Restrictions.in() for each sublist. These LogicalExpressions are joined with OR condition using Restictions.or(); This methods returns Criterion object.

private Criterion addRestrictions(String propertyName, List list) {	
		int size = list.size();		
		int fromIndex = 0;
		int toIndex = (size>1000)?1000:size;
		List subList = list.subList(fromIndex, toIndex);	
		Criterion lhs = Restrictions.in(propertyName, subList);
		toIndex = subList.size();
		size = size-toIndex;
		while(size>0) {
			fromIndex=toIndex;
			toIndex += (size>1000)?1000:size;
			subList = list.subList(fromIndex, toIndex);
			Criterion rhs = Restrictions.in(propertyName, subList);
			lhs = Restrictions.or(lhs, rhs);
			size = size-subList.size();
		}//while
		return lhs;
	}

How to Use it: I have a class Employee with many to one reference to Person. Now I need to search for employees where person is IN list of person objects. So here is my HQL using the above method:

List personsList; //Here personsList has more than 1000 entries.
Criteria criteria = session.createCriteria(Employee.class).add(addRestrictions("person", personsList);
List result = criteria.list();

P.S. I have executed this program with input size of 1050, 2100, 3100 and 3800 persons in personsList. I have recieved the following error message for all queries when personList.size>2000. So you have to increase shared memory on Oracle side.

# of _persons: 2007
Jan 18, 2008 1:12:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 4031, SQLState: 61000
Jan 18, 2008 1:12:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ORA-04031: unable to allocate 96 bytes of shared memory ("shared pool","select this_.id as id4_0_, t...","sql area","optdef : apanlg")


> Cannot put more than 1000 elements in a InExpression
> ----------------------------------------------------
>
>                 Key: HHH-1123
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123
>             Project: Hibernate3
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.1 rc2, 3.2.0.alpha1
>         Environment: Oracle 9i
>            Reporter: Alexis Seigneurin
>         Attachments: patch.txt
>
>   Original Estimate: 1 hour
>  Remaining Estimate: 1 hour
>
> The number of elements that we can put in a "in" expression is limited to a certain amount (1000 for Oracle, for instance). When creating a criteria query, the org.hibernate.criterion.InExpression class should split the expression into several smaller ones.
> Attached is a patch which splits the expression by slices of 500 elements. For example, if we have 1001 elements to put in the "in" expression, the result would be :
> (entity.field in (?, ?, ?...) or entity.field in (?, ?, ?...) or entity.field in (?))
> The surrounding parantheses are useful to avoid problems with other conditions (a "and" condition taking over the one of the "or" conditions).

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list