@Override protected boolean isDuplicateAssociation( final String foreignKeyTable, final String[] foreignKeyColumns) { //disable a join back to this same association final boolean isSameJoin = oneToManyPersister.getTableName().equals( foreignKeyTable ) && Arrays.equals( foreignKeyColumns, oneToManyPersister.getKeyColumnNames() ); return isSameJoin || super.isDuplicateAssociation( foreignKeyTable, foreignKeyColumns ); }
public void setQueryableCollection(QueryableCollection queryableCollection) { if ( this.queryableCollection != null ) { throw new IllegalStateException( "QueryableCollection is already defined for " + this + "!" ); } this.queryableCollection = queryableCollection; if ( !queryableCollection.isOneToMany() ) { // For many-to-many joins, use the tablename from the queryable collection for the default text. fromElement.setText( queryableCollection.getTableName() + " " + getTableAlias() ); } }
@Override protected void applyRootReturnTableFragments(SelectStatementBuilder selectStatementBuilder) { selectStatementBuilder.appendFromClauseFragment( getQueryableCollection().getTableName(), getCollectionReferenceAliases().getCollectionTableAlias() ); }
public static Iterable<AttributeDefinition> getCompositeCollectionIndexSubAttributes(CompositeCollectionElementDefinition compositionElementDefinition){ final QueryableCollection collectionPersister = (QueryableCollection) compositionElementDefinition.getCollectionDefinition().getCollectionPersister(); return getSingularSubAttributes( compositionElementDefinition.getSource(), (OuterJoinLoadable) collectionPersister.getOwnerEntityPersister(), (CompositeType) collectionPersister.getIndexType(), collectionPersister.getTableName(), collectionPersister.toColumns( "index" ) ); }
/** * Get sub-attribute definitions for a composite collection element. * @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() ); }
@Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final String entityName =criteriaQuery.getEntityName( criteria, propertyName ); final String role = entityName + '.' + criteriaQuery.getPropertyName( propertyName ); final QueryableCollection cp = (QueryableCollection) criteriaQuery.getFactory().getCollectionPersister( role ); final String[] fk = cp.getKeyColumnNames(); final String[] pk = ( (Loadable) cp.getOwnerEntityPersister() ).getIdentifierColumnNames(); final ConditionFragment subQueryRestriction = new ConditionFragment() .setTableAlias( criteriaQuery.getSQLAlias( criteria, propertyName ) ) .setCondition( pk, fk ); return String.format( Locale.ROOT, "? %s (select count(*) from %s where %s)", op, cp.getTableName(), subQueryRestriction.toFragmentString() ); }
@Override public final String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final String entityName = criteriaQuery.getEntityName( criteria, propertyName ); final String actualPropertyName = criteriaQuery.getPropertyName( propertyName ); final String sqlAlias = criteriaQuery.getSQLAlias( criteria, propertyName ); final SessionFactoryImplementor factory = criteriaQuery.getFactory(); final QueryableCollection collectionPersister = getQueryableCollection( entityName, actualPropertyName, factory ); final String[] collectionKeys = collectionPersister.getKeyColumnNames(); final String[] ownerKeys = ( (Loadable) factory.getEntityPersister( entityName ) ).getIdentifierColumnNames(); final String innerSelect = "(select 1 from " + collectionPersister.getTableName() + " where " + new ConditionFragment().setTableAlias( sqlAlias ).setCondition( ownerKeys, collectionKeys ).toFragmentString() + ")"; return excludeEmpty() ? "exists " + innerSelect : "not exists " + innerSelect; }
final QueryableCollection queryableCollection = (QueryableCollection) transactionsPersister; SimpleSelect select = new SimpleSelect( getDialect() ) .setTableName( queryableCollection.getTableName() ) .addColumn( "code" ) .addColumn( "transactions_index" );
selectString(associations) .setFromClause( collectionPersister.getTableName(), alias ) .setWhereClause( whereString.toString() ) .setOuterJoins(
private FromElement createCollectionJoin(JoinSequence collectionJoinSequence, String tableAlias) throws SemanticException { String text = queryableCollection.getTableName(); AST ast = createFromElement( text ); FromElement destination = (FromElement) ast; Type elementType = queryableCollection.getElementType(); if ( elementType.isCollectionType() ) { throw new SemanticException( "Collections of collections are not supported!" ); } destination.initializeCollection( fromClause, classAlias, tableAlias ); destination.setType( JOIN_FRAGMENT ); // Tag this node as a JOIN. destination.setIncludeSubclasses( false ); // Don't include subclasses in the join. destination.setCollectionJoin( true ); // This is a clollection join. destination.setJoinSequence( collectionJoinSequence ); destination.setOrigin( origin, false ); destination.setCollectionTableAlias( tableAlias ); // origin.addDestination( destination ); // This was the cause of HHH-242 // origin.setType( FROM_FRAGMENT ); // Set the parent node type so that the AST is properly formed. origin.setText( "" ); // The destination node will have all the FROM text. origin.setCollectionJoin( true ); // The parent node is a collection join too (voodoo - see JoinProcessor) fromClause.addCollectionJoinFromElementByPath( path, destination ); fromClause.getWalker().addQuerySpaces( queryableCollection.getCollectionSpaces() ); return destination; }
persister.getFetchMode(), path, persister.getTableName(), lhsColumns, !useInnerJoin,
private void visitCollectionElements(CollectionDefinition collectionDefinition) { final CollectionElementDefinition elementDefinition = collectionDefinition.getElementDefinition(); strategy.startingCollectionElements( elementDefinition ); try { final Type collectionElementType = elementDefinition.getType(); if ( collectionElementType.isAnyType() ) { visitAnyDefinition( elementDefinition.toAnyMappingDefinition() ); } else if ( collectionElementType.isComponentType() ) { visitCompositeDefinition( elementDefinition.toCompositeElementDefinition() ); } else if ( collectionElementType.isEntityType() ) { if ( !collectionDefinition.getCollectionPersister().isOneToMany() ) { final QueryableCollection queryableCollection = (QueryableCollection) collectionDefinition.getCollectionPersister(); addAssociationKey( new AssociationKey( queryableCollection.getTableName(), queryableCollection.getElementColumnNames() ) ); } visitEntityDefinition( elementDefinition.toEntityDefinition() ); } } finally { strategy.finishingCollectionElements( elementDefinition ); } }
compositeType.getFetchMode( i ), subPath, persister.getTableName(), lhsColumns, propertyNullability == null || propertyNullability[i],
lhsTableName = collectionPersister.getTableName(); lhsColumnNames = collectionPersister.getElementColumnNames();
protected boolean isDuplicateAssociation( final String foreignKeyTable, final String[] foreignKeyColumns ) { //disable a join back to this same association final boolean isSameJoin = oneToManyPersister.getTableName().equals(foreignKeyTable) && Arrays.equals( foreignKeyColumns, oneToManyPersister.getKeyColumnNames() ); return isSameJoin || super.isDuplicateAssociation(foreignKeyTable, foreignKeyColumns); }
@Override protected boolean isDuplicateAssociation( final String foreignKeyTable, final String[] foreignKeyColumns ) { //disable a join back to this same association final boolean isSameJoin = oneToManyPersister.getTableName().equals(foreignKeyTable) && Arrays.equals( foreignKeyColumns, oneToManyPersister.getKeyColumnNames() ); return isSameJoin || super.isDuplicateAssociation(foreignKeyTable, foreignKeyColumns); }
@Override protected boolean isDuplicateAssociation( final String foreignKeyTable, final String[] foreignKeyColumns ) { //disable a join back to this same association final boolean isSameJoin = oneToManyPersister.getTableName().equals(foreignKeyTable) && Arrays.equals( foreignKeyColumns, oneToManyPersister.getKeyColumnNames() ); return isSameJoin || super.isDuplicateAssociation(foreignKeyTable, foreignKeyColumns); }
public void setQueryableCollection(QueryableCollection queryableCollection) { if ( this.queryableCollection != null ) { throw new IllegalStateException( "QueryableCollection is already defined for " + this + "!" ); } this.queryableCollection = queryableCollection; if ( !queryableCollection.isOneToMany() ) { // For many-to-many joins, use the tablename from the queryable collection for the default text. fromElement.setText( queryableCollection.getTableName() + " " + getTableAlias() ); } }
public void setQueryableCollection(QueryableCollection queryableCollection) { if ( this.queryableCollection != null ) { throw new IllegalStateException( "QueryableCollection is already defined for " + this + "!" ); } this.queryableCollection = queryableCollection; if ( !queryableCollection.isOneToMany() ) { // For many-to-many joins, use the tablename from the queryable collection for the default text. fromElement.setText( queryableCollection.getTableName() + " " + getTableAlias() ); } }
public void setQueryableCollection(QueryableCollection queryableCollection) { if ( this.queryableCollection != null ) { throw new IllegalStateException( "QueryableCollection is already defined for " + this + "!" ); } this.queryableCollection = queryableCollection; if ( !queryableCollection.isOneToMany() ) { // For many-to-many joins, use the tablename from the queryable collection for the default text. fromElement.setText( queryableCollection.getTableName() + " " + getTableAlias() ); } }