2013-02-14 5 views
10

こんにちは、私は、この大規模なOracle HibernateのWebアプリケーションを持っており、このエラー休止基準は、句の中で1000年ブレイクアップ

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

を与えるようだと私は、Hibernateのユーザー定義されたコンポーネントとして誰かによってテストされたJavaコードが必要ですできるだけ簡単に自分の画面にJavaクラスを追加して、誰かがそのようなテスト済みのコンポーネントを持つことができますか?

答えて

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

。このコードは、hibernate 3とoracle 10gでテストされました – 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; 
} 

と利用FYI

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(); 
} 
関連する問題