2013-02-14 24 views
10

हाय मैं इस बड़े ओरेकल हाइबरनेट वेब अनुप्रयोगों है और यह इस त्रुटिहाइबरनेट मानदंड खण्ड में 1000 ब्रेक अप

ORA-01795: maximum number of expressions in a list is 1000

देने के लिए लगता है और मैं एक हाइबरनेट उपयोगकर्ता परिभाषित घटक के रूप में किसी के द्वारा परीक्षण किया एक जावा कोड की जरूरत मेरी स्क्रीन में मेरी खोज जावा क्लास में जितना संभव हो सके उतना आसान हो सकता है कि किसी के पास ऐसे परीक्षण घटक हो सकते हैं?

उत्तर

20

मैंने link से कोड के नीचे यह कोशिश की और यह खूबसूरती से काम करता प्रतीत होता है कि मैं कोड को पेस्ट कर दूंगा क्योंकि लिंक भविष्य में टूटा हुआ था।

यह सरल यह स्माइल रखें रखें :)

/** 
    * An utility method to build the Criterion Query IN clause if the number of parameter 
    * values passed has a size more than 1000. Oracle does not allow more than 
    * 1000 parameter values in a IN clause. Doing so a {@link SQLException} is 
    * thrown with error code, 'ORA-01795: maximum number of expressions in a list is 1000'. 
    * @param propertyName 
    * @param values 
    * @return 
    */ 
import java.util.List; 
import org.hibernate.criterion.Restrictions; 

/** 
* 
* @author 2796 
*/ 
public class SplitHibernateIn { 

    private static int PARAMETER_LIMIT = 999; 

    public static org.hibernate.criterion.Criterion buildInCriterion(String propertyName, List values) { 
     org.hibernate.criterion.Criterion criterion = null; 

     int listSize = values.size(); 
     for (int i = 0; i < listSize; i += PARAMETER_LIMIT) { 
      List subList; 
      if (listSize > i + PARAMETER_LIMIT) { 
       subList = values.subList(i, (i + PARAMETER_LIMIT)); 
      } else { 
       subList = values.subList(i, listSize); 
      } 
      if (criterion != null) { 
       criterion = Restrictions.or(criterion, Restrictions.in(propertyName, subList)); 
      } else { 
       criterion = Restrictions.in(propertyName, subList); 
      } 
     } 
     return criterion; 
    } 
} 
+0

FYI करें; इस कोड का परीक्षण हाइबरनेट 3 और ओरेकल 10 जी पर किया गया था – shareef

0

एक ही विचार है, लेकिन विधेय javax का उपयोग कर।

private static int PARAMETER_LIMIT = 999; 

private static Predicate createInStatement(CriteriaBuilder cb, Path fieldName, List values) { 
    int listSize = values.size(); 
    Predicate predicate = null; 
    for (int i = 0; i < listSize; i += PARAMETER_LIMIT) { 
     List subList; 
     if (listSize > i + PARAMETER_LIMIT) { 
      subList = values.subList(i, (i + PARAMETER_LIMIT)); 
     } else { 
      subList = values.subList(i, listSize); 
     } 
     if (predicate == null) { 
      predicate = fieldName.in(subList); 
     } else { 
      predicate = cb.or(predicate, fieldName.in(subList)); 
     } 
    } 
    return predicate; 
} 

और उपयोग

public List<Bean> getBeanList(List<Long> pkList) { 
    CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Bean> query = cb.createQuery(Bean.class); 
    Root<Bean> root = query.from(Bean.class); 

    // "Bean_" is a @StaticMetamodel(Bean.class) 
    Predicate inStatement = createInStatement(cb, root.get(Bean_.pk), pkList); 

    query.select(root).where(inStatement); 
    return entityManager.createQuery(query).getResultList(); 
}