Revision 44687

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.h2/src/main/java/org/gvsig/fmap/dal/store/h2/H2SpatialSQLBuilder.java
368 368
    public class H2SpatialSelectBuilderBase extends SelectBuilderBase {
369 369
        
370 370
        @Override
371
        protected boolean isValid(StringBuilder message) {
372
            if( message == null ) {
373
                message = new StringBuilder();
374
            }
375
            if( this.has_offset() && !this.has_order_by() ) {
376
                // Algunos gestores de BBDD requieren que se especifique un
377
                // orden para poder usar OFFSET. Como eso parece buena idea para
378
                // asegurar que siempre tengamos los mismo resultados, lo exijimos
379
                // siempre.
380
                message.append("Can't use OFFSET without an ORDER BY.");
381
                return false;
382
            }
383
            return true;
384
        }        
385
        
386
        @Override
387 371
        public String toString(Formatter formatter) {
388 372
            StringBuilder builder = new StringBuilder();
389 373
            if( !isValid(builder) ) {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/operations/ResultSetForSetProviderOperation.java
179 179
            // Probablemente deberiamos tener alguna otra forma de detectar que
180 180
            // estamos paginanado ya que asi no distinguimo si solo queremos 
181 181
            // obtener los primeros elementos sin importarnos su orden.
182
            for(String attrName : primaryKeys ) {
183
                // Se precisa indicar un orden para usar OFFSET.
184
                select.order_by().column(sqlbuilder.as_identifier(attrName)).ascending();
182
            if( primaryKeys.isEmpty() ) {
183
              // Muy probablemente si no tiene pk sea una vista, asi que 
184
              // pasaremos de ordenar y esperemos que la vista este ya ordenada.
185
              select.disable_check_order_and_offset();
186
            } else {
187
              for(String attrName : primaryKeys ) {
188
                  // Se precisa indicar un orden para usar OFFSET.
189
                  select.order_by().column(sqlbuilder.as_identifier(attrName)).ascending();
190
              }
185 191
            }
192
            
186 193
        }        
187 194
        if( limit > 0 ) {
188 195
            select.limit(limit);
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/SQLBuilder.java
238 238
        public boolean has_limit();
239 239

  
240 240
        public boolean has_offset();
241
        
242
        public void disable_check_order_and_offset();
241 243

  
242 244
        /**
243 245
         * Constructs the SQL statement. If the values associated with the SQL
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java
899 899
        protected List<OrderByBuilder> order_by;
900 900
        protected boolean distinct;
901 901
        protected List<Variable> groupColumn;
902
        protected boolean check_order_and_offset = true;
902 903

  
903 904
        public SelectBuilderBase() {
904 905
            this.columns = new ArrayList<>();
......
1093 1094
            return !this.groupColumn.isEmpty();
1094 1095
        }
1095 1096
        
1097
        @Override
1098
        public void disable_check_order_and_offset() {
1099
          this.check_order_and_offset = false;
1100
        }
1101
        
1096 1102
        protected boolean isValid(StringBuilder message) {
1097 1103
            if (message == null) {
1098 1104
                message = new StringBuilder();
1099 1105
            }
1100
            if (this.has_offset() && !this.has_order_by()) {
1101
                // Algunos gestores de BBDD requieren que se especifique un
1102
                // orden para poder usar OFFSET. Como eso parece buena idea para
1103
                // asegurar que siempre tengamos los mismo resultados, lo exijimos
1104
                // siempre.
1105
                message.append("Can't use OFFSET without an ORDER BY.");
1106
                return false;
1106
            if( this.check_order_and_offset ) {
1107
              if (this.has_offset() && !this.has_order_by()) {
1108
                  // Algunos gestores de BBDD requieren que se especifique un
1109
                  // orden para poder usar OFFSET. Como eso parece buena idea para
1110
                  // asegurar que siempre tengamos los mismo resultados, lo exijimos
1111
                  // siempre.
1112
                  message.append("Can't use OFFSET without an ORDER BY.");
1113
                  return false;
1114
              }
1107 1115
            }
1108 1116
            return true;
1109 1117
        }

Also available in: Unified diff