public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery) throws HibernateException { final StringBuilder stbuf = new StringBuilder(); final SessionFactoryImplementor factory = criteriaQuery.getFactory(); final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, propertyName ); final Dialect dialect = factory.getDialect(); if ( dialect instanceof SpatialDialect ) { final SpatialDialect seDialect = (SpatialDialect) dialect; stbuf.append( seDialect.getSpatialAggregateSQL( columns[0], SpatialAggregate.EXTENT ) ); stbuf.append( " as y" ).append( position ).append( '_' ); return stbuf.toString(); } return null; }
@Override public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final Type countFunctionReturnType = getFunction( criteriaQuery ).getReturnType( null, criteriaQuery.getFactory() ); return new Type[] { countFunctionReturnType }; }
@Override public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery) throws HibernateException { return getFunction( criteriaQuery ).render( null, ARGS, criteriaQuery.getFactory() ) + " as y" + position + '_'; }
@Override public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery) throws HibernateException { final SessionFactoryImplementor factory = criteriaQuery.getFactory(); final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName ); final Dialect dialect = factory.getDialect(); if ( dialect instanceof SpatialDialect ) { final SpatialDialect seDialect = (SpatialDialect) dialect; return new StringBuffer( seDialect.getSpatialAggregateSQL( columns[0], this.aggregate ) ).append( " y" ).append( position ) .append( "_" ).toString(); } else { throw new IllegalStateException( "Dialect must be spatially enabled dialect" ); } }
@Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final SessionFactoryImplementor factory = criteriaQuery.getFactory(); final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName ); final Dialect dialect = factory.getDialect(); if ( dialect instanceof SpatialDialect ) { final SpatialDialect seDialect = (SpatialDialect) dialect; return seDialect.getSpatialRelateSQL( columns[0], spatialRelation ); } else { throw new IllegalStateException( "Dialect must be spatially enabled dialect" ); } }
/** * Count the number of columns this projection uses. * * @param criteria The criteria * @param criteriaQuery The query * * @return The number of columns */ public int getColumnCount(Criteria criteria, CriteriaQuery criteriaQuery) { final Type[] types = getTypes( criteria, criteriaQuery ); int count = 0; for ( Type type : types ) { count += type.getColumnSpan( criteriaQuery.getFactory() ); } return count; }
@Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final SessionFactoryImplementor factory = criteriaQuery.getFactory(); final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName ); final Dialect dialect = factory.getDialect(); if ( dialect instanceof SpatialDialect ) { final SpatialDialect seDialect = (SpatialDialect) dialect; return seDialect.getSpatialFilterExpression( columns[0] ); } else { throw new IllegalStateException( "Dialect must be spatially enabled dialect" ); } }
private EntityMode getEntityMode(Criteria criteria, CriteriaQuery criteriaQuery) { final EntityPersister meta = criteriaQuery.getFactory().getEntityPersister( criteriaQuery.getEntityName( criteria ) ); final EntityMode result = meta.getEntityMode(); if ( ! meta.getEntityMetamodel().getTuplizer().isInstance( exampleEntity ) ) { throw new ClassCastException( exampleEntity.getClass().getName() ); } return result; }
protected SQLFunction getFunction(CriteriaQuery criteriaQuery) { final SQLFunctionRegistry sqlFunctionRegistry = criteriaQuery.getFactory().getSqlFunctionRegistry(); final SQLFunction function = sqlFunctionRegistry.findSQLFunction( "count" ); if ( function == null ) { throw new HibernateException( "Unable to locate count function mapping" ); } return function; }
@Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { return criteriaQuery.getFactory().getDialect().getNotExpression( criterion.toSqlString( criteria, criteriaQuery ) ); }
protected SQLFunction getFunction(String functionName, CriteriaQuery criteriaQuery) { final SQLFunction function = criteriaQuery.getFactory() .getSqlFunctionRegistry() .findSQLFunction( functionName ); if ( function == null ) { throw new HibernateException( "Unable to locate mapping for function named [" + functionName + "]" ); } return function; }
@Override public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { return new Type[] { getFunction( criteriaQuery ).getReturnType( criteriaQuery.getType( criteria, getPropertyName() ), criteriaQuery.getFactory() ) }; }
@Override public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { //the following two lines were added to ensure that this.params is not null, which //can happen with two-deep nested subqueries final SessionFactoryImplementor factory = criteriaQuery.getFactory(); createAndSetInnerQuery( criteriaQuery, factory ); final Type[] ppTypes = params.getPositionalParameterTypes(); final Object[] ppValues = params.getPositionalParameterValues(); final TypedValue[] tv = new TypedValue[ppTypes.length]; for ( int i=0; i<ppTypes.length; i++ ) { tv[i] = new TypedValue( ppTypes[i], ppValues[i] ); } return tv; }
@Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) { final Dialect dialect = criteriaQuery.getFactory().getDialect(); final String[] columns = criteriaQuery.findColumns( propertyName, criteria ); if ( columns.length != 1 ) { throw new HibernateException( "ilike may only be used with single-column properties" ); } if ( dialect instanceof PostgreSQLDialect || dialect instanceof PostgreSQL81Dialect) { return columns[0] + " ilike ?"; } else { return dialect.getLowercaseFunction() + '(' + columns[0] + ") like ?"; } }
@Override public String toSqlString(Criteria criteria, int loc, CriteriaQuery criteriaQuery) throws HibernateException { final String functionFragment = getFunction( criteriaQuery ).render( criteriaQuery.getType( criteria, getPropertyName() ), buildFunctionParameterList( criteria, criteriaQuery ), criteriaQuery.getFactory() ); return functionFragment + " as y" + loc + '_'; }
/** * Determines the {@code SpatialDialect} for the specified {@code CriteriaQuery}, and checks if the * specified function is supported. * * @param criteriaQuery The {@code CriteriaQuery} for which the dialect is sought * @param function The function for which to check support * * @return The {@code SpatialDialect} associated with the specified {@code CriteriaQuery} * * @throws HibernateException If the dialect for the specified {@code CriteriaQuery} is not a {@code SpatialDialect}. * or the specified {@code SpatialFunction} is not supported by the dialect. */ public static SpatialDialect getSpatialDialect(CriteriaQuery criteriaQuery, SpatialFunction function) { final Dialect dialect = criteriaQuery.getFactory().getDialect(); if ( !( dialect instanceof SpatialDialect ) ) { throw new HibernateException( "A spatial expression requires a spatial dialect." ); } final SpatialDialect spatialDialect = (SpatialDialect) dialect; if ( !spatialDialect.supports( function ) ) { throw new HibernateException( function + " function not supported by this dialect" ); } return spatialDialect; }
@Override public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) { final EntityPersister meta = criteriaQuery.getFactory().getEntityPersister( criteriaQuery.getEntityName( criteria ) ); final String[] propertyNames = meta.getPropertyNames(); final Type[] propertyTypes = meta.getPropertyTypes(); final Object[] values = meta.getPropertyValues( exampleEntity ); final List<TypedValue> list = new ArrayList<TypedValue>(); for ( int i=0; i<propertyNames.length; i++ ) { final Object value = values[i]; final Type type = propertyTypes[i]; final String name = propertyNames[i]; final boolean isVersionProperty = i == meta.getVersionProperty(); if ( ! isVersionProperty && isPropertyIncluded( value, name, type ) ) { if ( propertyTypes[i].isComponentType() ) { addComponentTypedValues( name, value, (CompositeType) type, list, criteria, criteriaQuery ); } else { addPropertyTypedValue( value, type, list ); } } } return list.toArray( new TypedValue[ list.size() ] ); }
@Override public String toSqlString(Criteria criteria,CriteriaQuery criteriaQuery) { final Dialect dialect = criteriaQuery.getFactory().getDialect(); final String[] columns = criteriaQuery.findColumns( propertyName, criteria ); if ( columns.length != 1 ) { throw new HibernateException( "Like may only be used with single-column properties" ); } final String escape = escapeChar == null ? "" : " escape \'" + escapeChar + "\'"; final String column = columns[0]; if ( ignoreCase ) { if ( dialect.supportsCaseInsensitiveLike() ) { return column +" " + dialect.getCaseInsensitiveLike() + " ?" + escape; } else { return dialect.getLowercaseFunction() + '(' + column + ')' + " like ?" + escape; } } else { return column + " like ?" + escape; } }
@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; }