Table of Contents
In some cases is useful to make result set that are union of two or more distinct result sets, this case is supported trough "UNION [ALL]" part of "SELECT" sql statement. To support this feature of SELECT statement, DODS introduced "addUnion(QueryBuilder, boolean all)" method in QueryBuilder class. To avoid possibilities of loosing data integrity there are some restrictions of using "UNION [ALL]" part of “SELECT” statement in QueryBuilder. If "addUnion(QueryBuilder, boolean all)" method of QueryBuilder is called then that query can not be used to directly retrieve xxxDO objects from database (you can not call runQuery() method of xxxQuery class) and only way to get some data is to allocate connection and directly call "executeQuery(DBConnection conn)" method of QueryBuilder class to get ResultSet.
Example:
DBConnection conn=DODS.getDatabaseManager().allocateConnection(); ResultSet rs=null; try { QueryBuilder tempQB1 = new QueryBuilder("PersonTable1","firstname,lastname"); QueryBuilder tempQB2 = new QueryBuilder("personSelfRef","firstname,lastname"); QueryBuilder tempQB2 = new QueryBuilder("PersonTable2","firstname,lastname"); tempQB1.addWhere(" firstname='mark' "); tempQB2.addWhere(" firstname='leo' "); tempQB1.addUnion(tempQB2, false); rs=tempQB1.executeQuery(conn); printResultSet(rs); rs.close(); }catch (Exception ex){ ex.printStackTrace(); }finally { conn.release(); }
Or You can use instance of QueryBuilder related to one or more other QueryBuilder instances (trough call of "addUnion(QueryBuilder, boolean all)" method, as part of "WHERE" statement in another instance of QueryBuilder.
Example:
query1 = new Table1Query(); qb1 = query1.getQueryBuilder(); qb1.setSelectClause(TABLE1.TABLE2OID); query2 = new Table2Query(); qb2 = query2.getQueryBuilder(); qb2.setSelectClause(TABLE2.OID); qb2.addUnion(qb1); query3 = new Table3Query(); qb3 = query3.getQueryBuilder(); qb3.addWhereIn((new RDBColumn(new RDBTable("TABLE3"),"TABLE2OID"), qb2); Table3Query.getDOArray();