[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-1123) Cannot put more than 1000 elements in a InExpression
Duke Biswas (JIRA)
noreply at atlassian.com
Mon Mar 3 09:04:33 EST 2008
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_29646 ]
Duke Biswas commented on HHH-1123:
----------------------------------
Hi:
I am not sure if you guys alread feagured this out but I have solution and I am attaching here
[code]
/**
* Special In Expression that handle maximum indentifiers. Note: This class
* could become an extension to Hibernate.
*
* @author BiswaD
*
*/
static class StockroomInExpression implements Criterion {
private static final long serialVersionUID = 1224146978925624808L;
protected static final int MAX_PARAMETER = 1000;
private String propertyName;
private Criterion criterion;
protected StockroomInExpression(String propertyName, String[] values) {
this.propertyName = propertyName;
this.criterion = buildSingleInCriterion(values, null, 0,
MAX_PARAMETER);
}
public TypedValue[] getTypedValues(Criteria criteria,
CriteriaQuery criteriaQuery) throws HibernateException {
return criterion.getTypedValues(criteria, criteriaQuery);
}
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {
return criterion.toSqlString(criteria, criteriaQuery);
}
/**
* Recursive method that will create criterion that will have inner
* criterion with OR IN statement
*
* @param values
* @param lhs
* @param startIndex
* @param recordSize
* @return
*/
private Criterion buildSingleInCriterion(String[] values,
Criterion lhs, int startIndex, int recordSize) {
if (startIndex >= values.length) {
return lhs;
} else if (recordSize + startIndex > values.length) {
return buildSingleInCriterion(values, lhs, startIndex,
values.length - startIndex);
} else {
String[] tempArray = values;
// Create a Temp array only if the current requested record size
// is less then selected bottles total size
if (values.length > recordSize) {
tempArray = new String[recordSize];
System.arraycopy(values, startIndex, tempArray, 0,
tempArray.length);
}
Property prop = Property.forName(propertyName);
if (lhs == null) {
lhs = prop.in(tempArray);
} else {
lhs = Restrictions.or(lhs, prop.in(tempArray));
}
return buildSingleInCriterion(values, lhs, startIndex
+ recordSize, recordSize);
}
}
}
[/code]
> 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