示例#1
0
  /**
   * Searches the class descriptor for the ojbConcrete class attribute if it finds the concrete
   * class attribute, append a where clause which specifies we can load all classes that are this
   * type or extents of this type.
   *
   * @param cld
   * @param crit
   * @return the passed in Criteria object + optionally and'ed criteria with OR'd class type
   *     discriminators.
   */
  private static Criteria addCriteriaForOjbConcreteClasses(ClassDescriptor cld, Criteria crit) {
    /** 1. check if this class has a ojbConcreteClass attribute */
    Criteria concreteClassDiscriminator = null;
    Collection classes = getExtentClasses(cld);

    /** 1. create a new Criteria for objConcreteClass */
    if (!classes.isEmpty()) {
      concreteClassDiscriminator = new Criteria();
      if (classes.size() > 1) {
        concreteClassDiscriminator = new Criteria();
        concreteClassDiscriminator.addIn(ClassDescriptor.OJB_CONCRETE_CLASS, classes);
      } else {
        concreteClassDiscriminator.addEqualTo(
            ClassDescriptor.OJB_CONCRETE_CLASS, classes.toArray()[0]);
      }
    }

    /**
     * 2. only add the AND (objConcreteClass = "some.class" OR....) if we've actually found concrete
     * classes.
     */
    if (concreteClassDiscriminator != null) {
      /**
       * it's possible there is no criteria attached to the query, and in this case we still have to
       * add the IN/EqualTo criteria for the concrete class type so check if the crit is null and
       * then create a blank one if needed.
       */
      if (crit == null) {
        crit = new Criteria();
      }

      crit.addAndCriteria(concreteClassDiscriminator);
    }
    /** will just return the passed in criteria if no OJB concrete class is attribute is found. */
    return crit;
  }