diff --git a/dbrepo-metadata-db/setup-schema.sql b/dbrepo-metadata-db/setup-schema.sql
index ce9488685b8592ea9169c810b075087574fc2325..047ecfe77783440def1475fa227a2fc09956cf2b 100644
--- a/dbrepo-metadata-db/setup-schema.sql
+++ b/dbrepo-metadata-db/setup-schema.sql
@@ -153,7 +153,6 @@
         dfID             BIGINT,
         cName            VARCHAR(100),
         internal_name    VARCHAR(100) NOT NULL,
-        alias            VARCHAR(100),
         Datatype         ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'),
         length           BIGINT       NULL,
         ordinal_position INTEGER      NOT NULL,
@@ -355,10 +354,11 @@
 
     CREATE TABLE IF NOT EXISTS `mdb_view_columns`
     (
-        id       BIGINT  NOT NULL AUTO_INCREMENT,
-        cid      BIGINT  NOT NULL,
-        vid      BIGINT  NOT NULL,
-        position INTEGER NULL,
+        id               BIGINT        NOT NULL AUTO_INCREMENT,
+        cid              BIGINT        NOT NULL,
+        vid              BIGINT        NOT NULL,
+        alias            VARCHAR(100),
+        ordinal_position INTEGER,
         PRIMARY KEY (id),
         FOREIGN KEY (vid) REFERENCES mdb_view (id),
         FOREIGN KEY (cid) REFERENCES mdb_columns (ID)
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
index 7888bb6fdde986f1e5c73213a811ac6c940fc9f6..46dbac13ca02f81f0df6df08146f5ec3c34a53b4 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
@@ -111,20 +111,13 @@ public class View {
         return this.internalName.equals(table.getName().replace("`", ""));
     }
 
-    /**
-     * Cascade cannot be CascadeType.PERSIST since columns already exist
-     */
     @ToString.Exclude
-    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
-    @JoinTable(name = "mdb_view_columns",
-            inverseJoinColumns = {
-                    @JoinColumn(name = "cid", referencedColumnName = "id"),
-            },
-            joinColumns = {
-                    @JoinColumn(name = "vid", referencedColumnName = "id"),
-            })
-    @OrderColumn(name = "position")
-    private List<TableColumn> columns;
+    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
+    @JoinColumns({
+            @JoinColumn(name = "vid", referencedColumnName = "id", updatable = false)
+    })
+    @OrderColumn(name = "ordinalPosition")
+    private List<ViewColumn> columns;
 
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
new file mode 100644
index 0000000000000000000000000000000000000000..10f13c3bd61c2eeac9c83fe2eff664eec4a99e46
--- /dev/null
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java
@@ -0,0 +1,53 @@
+package at.tuwien.entities.database;
+
+import at.tuwien.entities.database.table.columns.TableColumn;
+import lombok.*;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import jakarta.persistence.*;
+
+@Data
+@Entity
+@Builder(toBuilder = true)
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@EntityListeners(AuditingEntityListener.class)
+@jakarta.persistence.Table(name = "mdb_view_columns", uniqueConstraints = {
+        @UniqueConstraint(columnNames = {"cid", "vid"})
+})
+public class ViewColumn implements Comparable<ViewColumn> {
+
+    @Id
+    @EqualsAndHashCode.Include
+    @GeneratedValue(generator = "view-columns-sequence")
+    @GenericGenerator(name = "view-columns-sequence", strategy = "increment")
+    @Column(updatable = false, nullable = false)
+    private Long id;
+
+    @Column(updatable = false, nullable = false)
+    private String alias;
+
+    @Column(nullable = false)
+    private Integer ordinalPosition;
+
+    @ToString.Exclude
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
+    @JoinColumns({
+            @JoinColumn(name = "vid", referencedColumnName = "id", updatable = false)
+    })
+    private View view;
+
+    @ToString.Exclude
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
+    @JoinColumns({
+            @JoinColumn(name = "cid", referencedColumnName = "id", updatable = false)
+    })
+    private TableColumn column;
+
+    @Override
+    public int compareTo(ViewColumn tableColumn) {
+        return Integer.compare(this.ordinalPosition, tableColumn.getOrdinalPosition());
+    }
+}
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
index aa7b2dcd6c1032e297969fd0408825158f06d20f..2c37b13a2de2f1134bf1733b22ffedc29d7d4ddc 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java
@@ -73,7 +73,7 @@ public class TableColumn implements Comparable<TableColumn> {
     @Column
     private Long indexLength;
 
-    @Column
+    @Transient
     private String alias;
 
     @Column(name = "datatype", nullable = false, columnDefinition = "ENUM('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR')")
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java
index 9a9ee424fd315bfbe1c8e994ae073d78b445dea3..31bb6c0881a69fe524e3b83ae164b279efcbfef4 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java
@@ -619,12 +619,6 @@ public interface QueryMapper {
         return columnsToRawFindAllQuery(table.getInternalName(), table.getColumns(), timestamp, size, page);
     }
 
-    default String viewToRawFindAllQuery(View view, Long size, Long page) {
-        log.trace("mapping view to find all query, view={}, size={}, page={}", view, size, page);
-        /* param check */
-        return columnsToRawFindAllQuery(view.getInternalName(), view.getColumns(), null, size, page);
-    }
-
     private String columnsToRawFindAllQuery(String tableName, List<TableColumn> columns, Instant timestamp, Long size, Long page) {
         final int[] idx = new int[]{0};
         final StringBuilder statement = new StringBuilder("SELECT ");
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java
index 90e0ef07d1f111f10ef8d1d6f172ce27e5b92b33..d1fdb10b8f34de7a523505f98f1d95af7439f647 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java
@@ -4,6 +4,8 @@ import at.tuwien.api.database.ViewBriefDto;
 import at.tuwien.api.database.ViewCreateDto;
 import at.tuwien.api.database.ViewDto;
 import at.tuwien.entities.database.View;
+import at.tuwien.entities.database.ViewColumn;
+import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.exception.QueryMalformedException;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
@@ -14,6 +16,7 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.text.Normalizer;
+import java.util.List;
 import java.util.Locale;
 import java.util.regex.Pattern;
 
@@ -45,6 +48,19 @@ public interface ViewMapper {
 
     ViewBriefDto viewToViewBriefDto(View data);
 
+    TableColumn viewColumnToTableColumn(ViewColumn data);
+
+    default List<ViewColumn> tableColumnsToViewColumns(View view, List<TableColumn> data) {
+        final int[] idx = new int[]{0};
+        return data.stream()
+                .map(c -> ViewColumn.builder()
+                        .ordinalPosition(idx[0]++)
+                        .column(c)
+                        .view(view)
+                        .alias(c.getAlias())
+                        .build())
+                .toList();
+    }
 
     default PreparedStatement viewToSelectAll(Connection connection, View view, Long page, Long size) throws QueryMalformedException {
         log.debug("mapping view query, view.query={}, page={}, size={}", view.getQuery(), page, size);
@@ -53,7 +69,7 @@ public interface ViewMapper {
         view.getColumns()
                 .forEach(c -> statement.append(idx[0]++ > 0 ? "," : "")
                         .append("`")
-                        .append(c.getInternalName())
+                        .append(c.getColumn().getInternalName())
                         .append("`"));
         statement.append(" FROM `")
                 .append(view.getInternalName())
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
index c51f14874500e4763242c9e666d0321ea0dbd48c..89a87c5e260b9f4d4e671f9587d62f17045a54c6 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
@@ -400,8 +400,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
         assertEquals(DATABASE_1_OWNER, view1.getCreatedBy());
         assertNotNull(view1.getQuery());
         assertNotNull(view1.getQueryHash());
-        assertColumn(view1.getColumns().get(0), 0, "id", TableColumnType.BIGINT, null, false, true, true);
-        assertColumn(view1.getColumns().get(1), 1, "date", TableColumnType.DATE, null, false, false, false);
+        assertColumn(view1.getColumns().get(0).getColumn(), 0, "id", TableColumnType.BIGINT, null, false, true, true);
+        assertColumn(view1.getColumns().get(1).getColumn(), 1, "date", TableColumnType.DATE, null, false, false, false);
     }
 
     /* ################################################################################################### */
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
index c1b225310ad8bdcac8495eb6fe9fd8fe9c138bd6..50fa955f82d056b32610d20437b58e15bcb6363a 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
@@ -7,6 +7,7 @@ import at.tuwien.api.database.ViewCreateDto;
 import at.tuwien.config.MariaDbConfig;
 import at.tuwien.config.MariaDbContainerConfig;
 import at.tuwien.entities.database.View;
+import at.tuwien.entities.database.ViewColumn;
 import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.exception.*;
 import at.tuwien.repository.mdb.*;
@@ -184,18 +185,18 @@ public class ViewServiceIntegrationTest extends BaseUnitTest {
         assertEquals(VIEW_2_NAME + "_with_alias", response.getName());
         assertEquals(VIEW_2_INTERNAL_NAME + "_with_alias", response.getInternalName());
         assertEquals(VIEW_2_QUERY, response.getQuery());
-        final List<TableColumn> columns = response.getColumns();
+        final List<ViewColumn> columns = response.getColumns();
         assertEquals(4, columns.size());
-        final TableColumn column0 = columns.get(0);
+        final TableColumn column0 = columns.get(0).getColumn();
         assertEquals("date", column0.getInternalName());
         assertNull(column0.getAlias());
-        final TableColumn column1 = columns.get(1);
+        final TableColumn column1 = columns.get(1).getColumn();
         assertEquals("location", column1.getInternalName());
         assertEquals("loc", column1.getAlias());
-        final TableColumn column2 = columns.get(2);
+        final TableColumn column2 = columns.get(2).getColumn();
         assertEquals("rainfall", column2.getInternalName());
         assertNull(column2.getAlias());
-        final TableColumn column3 = columns.get(3);
+        final TableColumn column3 = columns.get(3).getColumn();
         assertEquals("mintemp", column3.getInternalName());
         assertNull(column3.getAlias());
     }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
index 1b675b0fac3e2ebecf7eb8349ced51f8e8f3d15a..59ef1aa88e5fe765e28c135458e1ac2a30ea70b2 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
@@ -1,7 +1,6 @@
 package at.tuwien.service.impl;
 
 import at.tuwien.api.database.DatabaseCreateDto;
-import at.tuwien.api.database.DatabaseModifyImageDto;
 import at.tuwien.api.database.DatabaseModifyVisibilityDto;
 import at.tuwien.api.database.DatabaseTransferDto;
 import at.tuwien.config.QueryConfig;
@@ -18,6 +17,7 @@ import at.tuwien.exception.*;
 import at.tuwien.mapper.DatabaseMapper;
 import at.tuwien.mapper.QueryMapper;
 import at.tuwien.mapper.TableMapper;
+import at.tuwien.mapper.ViewMapper;
 import at.tuwien.repository.mdb.ContainerRepository;
 import at.tuwien.repository.mdb.DatabaseRepository;
 import at.tuwien.repository.sdb.DatabaseIdxRepository;
@@ -42,6 +42,7 @@ import java.util.*;
 @Service
 public class MariaDbServiceImpl extends HibernateConnector implements DatabaseService {
 
+    private final ViewMapper viewMapper;
     private final QueryConfig queryConfig;
     private final QueryMapper queryMapper;
     private final TableMapper tableMapper;
@@ -53,10 +54,11 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
     private final DatabaseIdxRepository databaseIdxRepository;
 
     @Autowired
-    public MariaDbServiceImpl(QueryConfig queryConfig, QueryMapper queryMapper, TableMapper tableMapper,
-                              UserService userService, DatabaseMapper databaseMapper, ContainerService containerService,
-                              DatabaseRepository databaseRepository, ContainerRepository containerRepository,
-                              DatabaseIdxRepository databaseIdxRepository) {
+    public MariaDbServiceImpl(ViewMapper viewMapper, QueryConfig queryConfig, QueryMapper queryMapper,
+                              TableMapper tableMapper, UserService userService, DatabaseMapper databaseMapper,
+                              ContainerService containerService, DatabaseRepository databaseRepository,
+                              ContainerRepository containerRepository, DatabaseIdxRepository databaseIdxRepository) {
+        this.viewMapper = viewMapper;
         this.queryConfig = queryConfig;
         this.queryMapper = queryMapper;
         this.tableMapper = tableMapper;
@@ -322,11 +324,15 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
         log.debug("database with id {} misses view(s) in metadata database: {}", databaseId, diffViews.stream().map(View::getInternalName).toList());
         for (View view : diffViews) {
             try {
-                view.setColumns(queryMapper.parseColumns(view.getQuery(), database));
+                view.setColumns(viewMapper.tableColumnsToViewColumns(view, queryMapper.parseColumns(view.getQuery(), database)));
             } catch (JSQLParserException e) {
                 log.error("Failed to map/parse columns: {}", e.getMessage());
                 throw new ColumnParseException("Failed to map/parse columns: " + e.getMessage(), e);
             }
+            if (view.getColumns().stream().anyMatch(c -> c.getColumn().getId() == null)) {
+                log.warn("Skipping creation of view {}: referenced columns does not exist in metadata database", view.getInternalName());
+                continue;
+            }
             database.getViews()
                     .add(view);
         }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java
index 775df9e82dda9c5604114faeebd840b37c9284cb..2707d3d3579b33b220d3f94a900942e80fd6f17a 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java
@@ -195,7 +195,11 @@ public class QueryServiceImpl extends HibernateConnector implements QueryService
             final Connection connection = dataSource.getConnection();
             final PreparedStatement preparedStatement = viewMapper.viewToSelectAll(connection, view, page, size);
             final ResultSet resultSet = preparedStatement.executeQuery();
-            return queryMapper.resultListToQueryResultDto(view.getColumns(), resultSet);
+            final List<TableColumn> columns = view.getColumns()
+                    .stream()
+                    .map(viewMapper::viewColumnToTableColumn)
+                    .toList();
+            return queryMapper.resultListToQueryResultDto(columns, resultSet);
         } catch (SQLException e) {
             log.error("Failed to map object: {}", e.getMessage());
             throw new TableMalformedException("Failed to map object: " + e.getMessage(), e);
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
index 2a57cadf190fa111233efb30c5fa13ba384411cb..5fadde3b28d8530c3c545763957daf1091756697 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
@@ -3,6 +3,7 @@ package at.tuwien.service.impl;
 import at.tuwien.api.database.ViewCreateDto;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.View;
+import at.tuwien.entities.database.ViewColumn;
 import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.exception.*;
 import at.tuwien.mapper.DatabaseMapper;
@@ -171,8 +172,8 @@ public class ViewServiceImpl extends HibernateConnector implements ViewService {
                         .toString())
                 .isInitialView(false)
                 .isPublic(data.getIsPublic())
-                .columns(columns)
                 .build();
+        entity.setColumns(viewMapper.tableColumnsToViewColumns(entity, columns));
         database.getViews()
                 .add(entity);
         final Optional<View> optional = databaseRepository.save(database)
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index 67a2711a98bc1b93492fdfb25102daf6f9c0037b..6d60d4219b4223816e76a9d452c8606d8c58cf05 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -4908,10 +4908,19 @@ public abstract class BaseTest {
     public final static String VIEW_1_QUERY = "select `location`, `lat`, `lng` from `weather_location`";
     public final static String VIEW_1_QUERY_HASH = "dc81a6877c7c51a6a6f406e1fc2a255e44a0d49a20548596e0d583c3eb849c23";
 
-    public final static List<TableColumn> VIEW_1_COLUMNS = List.of(
-            TABLE_2_COLUMNS.get(0),
-            TABLE_2_COLUMNS.get(1),
-            TABLE_2_COLUMNS.get(2)
+    public final static List<ViewColumn> VIEW_1_COLUMNS = List.of(
+            ViewColumn.builder()
+                    .ordinalPosition(0)
+                    .column(TABLE_2_COLUMNS.get(0))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(1)
+                    .column(TABLE_2_COLUMNS.get(1))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(2)
+                    .column(TABLE_2_COLUMNS.get(2))
+                    .build()
     );
 
     public final static List<ColumnDto> VIEW_1_COLUMNS_DTO = List.of(
@@ -4974,11 +4983,23 @@ public abstract class BaseTest {
     public final static String VIEW_2_QUERY = "select `date`, `location` as loc, `rainfall`, `mintemp` from `weather_aus` where `location` = 'Albury'";
     public final static String VIEW_2_QUERY_HASH = "987fc946772ffb6d85060262dcb5df419692a1f6772ea995e3dedb53c191e984";
 
-    public final static List<TableColumn> VIEW_2_COLUMNS = List.of(
-            TABLE_1_COLUMNS.get(1),
-            TABLE_1_COLUMNS.get(2),
-            TABLE_1_COLUMNS.get(4),
-            TABLE_1_COLUMNS.get(3)
+    public final static List<ViewColumn> VIEW_2_COLUMNS = List.of(
+            ViewColumn.builder()
+                    .ordinalPosition(0)
+                    .column(TABLE_1_COLUMNS.get(1))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(1)
+                    .column(TABLE_1_COLUMNS.get(2))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(2)
+                    .column(TABLE_1_COLUMNS.get(4))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(3)
+                    .column(TABLE_1_COLUMNS.get(3))
+                    .build()
     );
 
     public final static List<ColumnDto> VIEW_2_COLUMNS_DTO = List.of(
@@ -5036,11 +5057,23 @@ public abstract class BaseTest {
     public final static String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`";
     public final static String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255";
 
-    public final static List<TableColumn> VIEW_3_COLUMNS = List.of(
-            TABLE_1_COLUMNS.get(3),
-            TABLE_1_COLUMNS.get(4),
-            TABLE_1_COLUMNS.get(2),
-            TABLE_1_COLUMNS.get(1)
+    public final static List<ViewColumn> VIEW_3_COLUMNS = List.of(
+            ViewColumn.builder()
+                    .ordinalPosition(0)
+                    .column(TABLE_1_COLUMNS.get(3))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(1)
+                    .column(TABLE_1_COLUMNS.get(4))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(2)
+                    .column(TABLE_1_COLUMNS.get(2))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(3)
+                    .column(TABLE_1_COLUMNS.get(1))
+                    .build()
     );
 
     public final static List<ColumnDto> VIEW_3_COLUMNS_DTO = List.of(
@@ -5100,24 +5133,75 @@ public abstract class BaseTest {
     public final static String VIEW_4_QUERY = "SELECT `animal_name`, `hair`, `feathers`, `eggs`, `milk`, `airborne`, `aquatic`, `predator`, `backbone`, `breathes`, `venomous`, `fins`, `legs`, `tail`, `domestic`, `catsize`, `class_type` FROM `zoo` WHERE `class_type` = 1";
     public final static String VIEW_4_QUERY_HASH = "3561cd0bb0b0e94d6f15ae602134252a5760d09d660a71a4fb015b6991c8ba0b";
 
-    public final static List<TableColumn> VIEW_4_COLUMNS = List.of(
-            TABLE_5_COLUMNS.get(1),
-            TABLE_5_COLUMNS.get(2),
-            TABLE_5_COLUMNS.get(3),
-            TABLE_5_COLUMNS.get(5),
-            TABLE_5_COLUMNS.get(6),
-            TABLE_5_COLUMNS.get(8),
-            TABLE_5_COLUMNS.get(10),
-            TABLE_5_COLUMNS.get(11),
-            TABLE_5_COLUMNS.get(12),
-            TABLE_5_COLUMNS.get(13),
-            TABLE_5_COLUMNS.get(14),
-            TABLE_5_COLUMNS.get(15),
-            TABLE_5_COLUMNS.get(16),
-            TABLE_5_COLUMNS.get(17),
-            TABLE_5_COLUMNS.get(18),
-            TABLE_5_COLUMNS.get(19),
-            TABLE_5_COLUMNS.get(20)
+    public final static List<ViewColumn> VIEW_4_COLUMNS = List.of(
+            ViewColumn.builder()
+                    .ordinalPosition(0)
+                    .column(TABLE_5_COLUMNS.get(1))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(1)
+                    .column(TABLE_5_COLUMNS.get(2))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(2)
+                    .column(TABLE_5_COLUMNS.get(3))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(3)
+                    .column(TABLE_5_COLUMNS.get(5))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(4)
+                    .column(TABLE_5_COLUMNS.get(6))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(5)
+                    .column(TABLE_5_COLUMNS.get(8))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(6)
+                    .column(TABLE_5_COLUMNS.get(10))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(7)
+                    .column(TABLE_5_COLUMNS.get(11))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(8)
+                    .column(TABLE_5_COLUMNS.get(12))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(9)
+                    .column(TABLE_5_COLUMNS.get(13))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(10)
+                    .column(TABLE_5_COLUMNS.get(14))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(11)
+                    .column(TABLE_5_COLUMNS.get(15))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(12)
+                    .column(TABLE_5_COLUMNS.get(16))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(13)
+                    .column(TABLE_5_COLUMNS.get(17))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(14)
+                    .column(TABLE_5_COLUMNS.get(18))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(15)
+                    .column(TABLE_5_COLUMNS.get(19))
+                    .build(),
+            ViewColumn.builder()
+                    .ordinalPosition(16)
+                    .column(TABLE_5_COLUMNS.get(20))
+                    .build()
     );
 
     public final static List<ColumnDto> VIEW_4_COLUMNS_DTO = List.of(