Package org.hibernate.persister.collection

Examples of org.hibernate.persister.collection.QueryableCollection


   * @param compositionElementDefinition - composite collection element definition.
   * @return sub-attribute definitions for a composite collection element.
   */
  public static Iterable<AttributeDefinition> getCompositeCollectionElementSubAttributes(
      CompositeCollectionElementDefinition compositionElementDefinition) {
    final QueryableCollection collectionPersister =
        (QueryableCollection) compositionElementDefinition.getCollectionDefinition().getCollectionPersister();
    return getSingularSubAttributes(
        compositionElementDefinition.getSource(),
        (OuterJoinLoadable) collectionPersister.getOwnerEntityPersister(),
        (CompositeType) collectionPersister.getElementType(),
        collectionPersister.getTableName(),
        collectionPersister.getElementColumnNames()
    );
  }
View Full Code Here


    }

    // TODO : most of below was taken verbatim from DotNode; should either delegate this logic or super-type it
    CollectionType type = (CollectionType) getDataType();
    String role = type.getRole();
    QueryableCollection queryableCollection = getSessionFactoryHelper().requireQueryableCollection(role);

    String alias = null// DotNode uses null here...
    String columnTableAlias = getFromElement().getTableAlias();
    JoinType joinType = JoinType.INNER_JOIN;
    boolean fetch = false;

    FromElementFactory factory = new FromElementFactory(
        getWalker().getCurrentFromClause(),
        getFromElement(),
        propertyName,
        alias,
        getFromElement().toColumns(columnTableAlias, propertyName, false),
        true
    );
    FromElement elem = factory.createCollection(queryableCollection, role, joinType, fetch, true);
    setFromElement(elem);
    getWalker().addQuerySpaces(queryableCollection.getCollectionSpaces())// Always add the collection's query spaces.
  }
View Full Code Here

          String.format( "Non-Map attribute [%s] cannot be target of key subgraph", getAttributeName() )
      );
    }

    final AssociationType attributeType = (AssociationType) Helper.resolveType( sessionFactory(), attribute );
    final QueryableCollection collectionPersister = (QueryableCollection) attributeType.getAssociatedJoinable( sessionFactory() );
    final Type indexType = collectionPersister.getIndexType();

    if ( ! indexType.isAssociationType() ) {
      throw new IllegalArgumentException(
          String.format( "Map index [%s] is not an entity; cannot be target of key subgraph", getAttributeName() )
      );
View Full Code Here

  public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
  throws HibernateException {
    String role = criteriaQuery.getEntityName(criteria, propertyName) +
        '.'
        criteriaQuery.getPropertyName(propertyName);
    QueryableCollection cp = (QueryableCollection) criteriaQuery.getFactory()
        .getCollectionPersister(role);
    //String[] fk = StringHelper.qualify( "collection_", cp.getKeyColumnNames() );
    String[] fk = cp.getKeyColumnNames();
    String[] pk = ( (Loadable) cp.getOwnerEntityPersister() ).getIdentifierColumnNames(); //TODO: handle property-ref
    return "? " +
        op +
        " (select count(*) from " +
        cp.getTableName() +
        //" collection_ where " +
        " where " +
        new ConditionFragment()
            .setTableAlias( criteriaQuery.getSQLAlias(criteria, propertyName) )
            .setCondition(pk, fk)
View Full Code Here

  public String getAssociatedEntityName(SessionFactoryImplementor factory)
      throws MappingException {
    try {
     
      QueryableCollection collectionPersister = (QueryableCollection) factory
          .getCollectionPersister( role );
     
      if ( !collectionPersister.getElementType().isEntityType() ) {
        throw new MappingException(
            "collection was not an association: " +
            collectionPersister.getRole()
          );
      }
     
      return collectionPersister.getElementPersister().getEntityName();
     
    }
    catch (ClassCastException cce) {
      throw new MappingException( "collection role is not queryable " + role );
    }
View Full Code Here

    boolean isSizeProperty = getNextSibling()!=null &&
      CollectionProperties.isAnyCollectionProperty( getNextSibling().getText() );

    if ( isSizeProperty ) indexed = true; //yuck!

    QueryableCollection queryableCollection = getSessionFactoryHelper().requireQueryableCollection( role );
    String propName = getPath();
    FromClause currentFromClause = getWalker().getCurrentFromClause();

    if ( getWalker().getStatementType() != SqlTokenTypes.SELECT && indexed && classAlias == null ) {
      // should indicate that we are processing an INSERT/UPDATE/DELETE
      // query with a subquery implied via a collection property
      // function. Here, we need to use the table name itself as the
      // qualification alias.
      // TODO : verify this works for all databases...
      // TODO : is this also the case in non-"indexed" scenarios?
      String alias = getLhs().getFromElement().getQueryable().getTableName();
      columns = getFromElement().toColumns( alias, propertyPath, false, true );
    }

    //We do not look for an existing join on the same path, because
    //it makes sense to join twice on the same collection role
    FromElementFactory factory = new FromElementFactory(
            currentFromClause,
            getLhs().getFromElement(),
            propName,
        classAlias,
            getColumns(),
            implicitJoin
    );
    FromElement elem = factory.createCollection( queryableCollection, role, joinType, fetch, indexed );

    if ( log.isDebugEnabled() ) {
      log.debug( "dereferenceCollection() : Created new FROM element for " + propName + " : " + elem );
    }

    setImpliedJoin( elem );
    setFromElement( elem )// This 'dot' expression now refers to the resulting from element.

    if ( isSizeProperty ) {
      elem.setText("");
      elem.setUseWhereFragment(false);
    }

    if ( !implicitJoin ) {
      EntityPersister entityPersister = elem.getEntityPersister();
      if ( entityPersister != null ) {
        getWalker().addQuerySpaces( entityPersister.getQuerySpaces() );
      }
    }
    getWalker().addQuerySpaces( queryableCollection.getCollectionSpaces() )// Always add the collection's query spaces.
  }
View Full Code Here

        ArrayHelper.addAll( querySpaces, persister.getQuerySpaces() );
      }
      else if ( rtn instanceof CollectionReturn ) {
        CollectionReturn collRtn = ( CollectionReturn ) rtn;
        String role = collRtn.getOwnerEntityName() + "." + collRtn.getOwnerProperty();
        QueryableCollection persister = ( QueryableCollection ) factory.getCollectionPersister( role );
        collectionPersisters.add( persister );
        lockModes.add( collRtn.getLockMode() );
        resultColumnProcessors.add( new NonScalarResultColumnProcessor( returnableCounter++ ) );
        nonScalarReturnList.add( rtn );
        collectionOwners.add( new Integer( -1 ) );
        resultTypes.add( persister.getType() );
        specifiedAliases.add( collRtn.getAlias() );
        collectionAliases.add( collRtn.getCollectionAliases() );
        // determine if the collection elements are entities...
        Type elementType = persister.getElementType();
        if ( elementType.isEntityType() ) {
          Queryable elementPersister = ( Queryable ) ( ( EntityType ) elementType ).getAssociatedJoinable( factory );
          entityPersisters.add( elementPersister );
          entityOwners.add( new Integer( -1 ) );
          entityAliases.add( collRtn.getElementEntityAliases() );
          ArrayHelper.addAll( querySpaces, elementPersister.getQuerySpaces() );
        }
      }
      else if ( rtn instanceof EntityFetchReturn ) {
        EntityFetchReturn fetchRtn = ( EntityFetchReturn ) rtn;
        NonScalarReturn ownerDescriptor = fetchRtn.getOwner();
        int ownerIndex = nonScalarReturnList.indexOf( ownerDescriptor );
        entityOwners.add( new Integer( ownerIndex ) );
        lockModes.add( fetchRtn.getLockMode() );
        Queryable ownerPersister = determineAppropriateOwnerPersister( ownerDescriptor );
        EntityType fetchedType = ( EntityType ) ownerPersister.getPropertyType( fetchRtn.getOwnerProperty() );
        String entityName = fetchedType.getAssociatedEntityName( getFactory() );
        Queryable persister = ( Queryable ) factory.getEntityPersister( entityName );
        entityPersisters.add( persister );
        nonScalarReturnList.add( rtn );
        specifiedAliases.add( fetchRtn.getAlias() );
        entityAliases.add( fetchRtn.getEntityAliases() );
        ArrayHelper.addAll( querySpaces, persister.getQuerySpaces() );
      }
      else if ( rtn instanceof CollectionFetchReturn ) {
        CollectionFetchReturn fetchRtn = ( CollectionFetchReturn ) rtn;
        NonScalarReturn ownerDescriptor = fetchRtn.getOwner();
        int ownerIndex = nonScalarReturnList.indexOf( ownerDescriptor );
        collectionOwners.add( new Integer( ownerIndex ) );
        lockModes.add( fetchRtn.getLockMode() );
        Queryable ownerPersister = determineAppropriateOwnerPersister( ownerDescriptor );
        String role = ownerPersister.getEntityName() + '.' + fetchRtn.getOwnerProperty();
        QueryableCollection persister = ( QueryableCollection ) factory.getCollectionPersister( role );
        collectionPersisters.add( persister );
        nonScalarReturnList.add( rtn );
        specifiedAliases.add( fetchRtn.getAlias() );
        collectionAliases.add( fetchRtn.getCollectionAliases() );
        // determine if the collection elements are entities...
        Type elementType = persister.getElementType();
        if ( elementType.isEntityType() ) {
          Queryable elementPersister = ( Queryable ) ( ( EntityType ) elementType ).getAssociatedJoinable( factory );
          entityPersisters.add( elementPersister );
          entityOwners.add( new Integer( ownerIndex ) );
          entityAliases.add( fetchRtn.getElementEntityAliases() );
View Full Code Here

    OuterJoinableAssociation last = null;
    while ( iter.hasNext() ) {
      OuterJoinableAssociation oj = (OuterJoinableAssociation) iter.next();
      if ( oj.getJoinType() == JoinFragment.LEFT_OUTER_JOIN ) { // why does this matter?
        if ( oj.getJoinable().isCollection() ) {
          final QueryableCollection queryableCollection = (QueryableCollection) oj.getJoinable();
          if ( queryableCollection.hasOrdering() ) {
            final String orderByString = queryableCollection.getSQLOrderByString( oj.getRHSAlias() );
            buf.append( orderByString ).append(", ");
          }
        }
        else {
          // it might still need to apply a collection ordering based on a
          // many-to-many defined order-by...
          if ( last != null && last.getJoinable().isCollection() ) {
            final QueryableCollection queryableCollection = (QueryableCollection) last.getJoinable();
            if ( queryableCollection.isManyToMany() && last.isManyToManyWith( oj ) ) {
              if ( queryableCollection.hasManyToManyOrdering() ) {
                final String orderByString = queryableCollection.getManyToManyOrderByString( oj.getRHSAlias() );
                buf.append( orderByString ).append(", ");
              }
            }
          }
        }
View Full Code Here

        i++;
       
      }
      else {
       
        QueryableCollection collPersister = (QueryableCollection) oj.getJoinable();
        if ( oj.getJoinType()==JoinFragment.LEFT_OUTER_JOIN ) {
          //it must be a collection fetch
          collectionPersisters[j] = collPersister;
          collectionOwners[j] = oj.getOwner(associations);
          j++;
        }
 
        if ( collPersister.isOneToMany() ) {
          persisters[i] = (Loadable) collPersister.getElementPersister();
          aliases[i] = oj.getRHSAlias();
          i++;
        }
      }
    }
View Full Code Here

    }
  }

  public boolean isManyToManyWith(OuterJoinableAssociation other) {
    if ( joinable.isCollection() ) {
      QueryableCollection persister = ( QueryableCollection ) joinable;
      if ( persister.isManyToMany() ) {
        return persister.getElementType() == other.getJoinableType();
      }
    }
    return false;
  }
View Full Code Here

TOP

Related Classes of org.hibernate.persister.collection.QueryableCollection

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.