public String addFromCollection(QueryTranslatorImpl q) throws QueryException { Type collectionElementType = getPropertyType(); if (collectionElementType == null) { throw new QueryException( "must specify 'elements' for collection valued property in from clause: " + path); } if (collectionElementType.isEntityType()) { // an association QueryableCollection collectionPersister = q.getCollectionPersister(collectionRole); Queryable entityPersister = (Queryable) collectionPersister.getElementPersister(); String clazz = entityPersister.getEntityName(); final String elementName; if (collectionPersister.isOneToMany()) { elementName = collectionName; // allow index() function: q.decoratePropertyMapping(elementName, collectionPersister); } else { // many-to-many q.addCollection(collectionName, collectionRole); elementName = q.createNameFor(clazz); addJoin(elementName, (AssociationType) collectionElementType); } q.addFrom(elementName, clazz, joinSequence); currentPropertyMapping = new CollectionPropertyMapping(collectionPersister); return elementName; } else { // collections of values q.addFromCollection(collectionName, collectionRole, joinSequence); return collectionName; } }
public String addFromAssociation(QueryTranslatorImpl q) throws QueryException { if (isCollectionValued()) { return addFromCollection(q); } else { q.addFrom(currentName, joinSequence); return currentName; } }
/** Used for collection filters */ private void addFromAssociation(final String elementName, final String collectionRole) throws QueryException { // q.addCollection(collectionName, collectionRole); QueryableCollection persister = getCollectionPersister(collectionRole); Type collectionElementType = persister.getElementType(); if (!collectionElementType.isEntityType()) { throw new QueryException("collection of values in filter: " + elementName); } String[] keyColumnNames = persister.getKeyColumnNames(); // if (keyColumnNames.length!=1) throw new QueryException("composite-key collection in filter: " // + collectionRole); String collectionName; JoinSequence join = new JoinSequence(getFactory()); collectionName = persister.isOneToMany() ? elementName : createNameForCollection(collectionRole); join.setRoot(persister, collectionName); if (!persister.isOneToMany()) { // many-to-many addCollection(collectionName, collectionRole); try { join.addJoin( (AssociationType) persister.getElementType(), elementName, JoinType.INNER_JOIN, persister.getElementColumnNames(collectionName)); } catch (MappingException me) { throw new QueryException(me); } } join.addCondition(collectionName, keyColumnNames, " = ?"); // if ( persister.hasWhere() ) join.addCondition( persister.getSQLWhereString(collectionName) ); EntityType elemType = (EntityType) collectionElementType; addFrom(elementName, elemType.getAssociatedEntityName(), join); }
void addFromClass(String name, Queryable classPersister) throws QueryException { JoinSequence joinSequence = new JoinSequence(getFactory()).setRoot(classPersister, name); // crossJoins.add(name); addFrom(name, classPersister.getEntityName(), joinSequence); }
void addFrom(String name, String type, JoinSequence joinSequence) throws QueryException { addType(name, type); addFrom(name, joinSequence); }