Hello,

The offending piece of logic is here
This adds all fields from a table to a select clause

        sq.addSelect(returningFields);

This adds new fields to the fromFrom table's internal list of fields:

        List<Field<?>> allFields = fromTable.asTable().getFields();
        for (int x = 0; x < joinTables.size(); x++) {
            allFields.addAll(joinTables.get(x).asTable().getFields());
        }

Every time you're running the above loop, the generated table instance
gets new fields.
As a workaround, you should not modify the result from getFields(),
but create your own copy like this:

        List<Field<?>> allFields = new
ArrayList<Field<?>>(fromTable.asTable().getFields())

Clearly, this is a flaw in jOOQ and will be corrected in the next
release. Generated Tables are expected to be immutable objects:
https://sourceforge.net/apps/trac/jooq/ticket/1199

Thanks for reporting this!

Cheers
Lukas

2012/3/1  <[email protected]>:
> Ok,
> Thank you!
>
> The project is developed with netbeans. (+simple h2 db)
>
> I attach you the project
>
> Feel free to contact me for everything.
>
> Thank you again,
>
> Agharta
>
>
>
>
> Il giorno giovedì 1 marzo 2012 15:39:20 UTC+1, Lukas Eder ha scritto:
>>
>> Hello Agharta,
>>
>> You can attach files to mails to the user group
>>
>> Cheers
>> Lukas
>>
>> 2012/3/1 Agharta agharta
>>
>> > Hi Mr Lukas Eder,
>> > Thank you for the quick reply.
>> >
>> > To find the problem, i've created a test case, with scripts and i have
>> > simulated the problem.
>> >
>> > How to send the test case zip file?
>> >
>> > Thank you,
>> >
>> > Agharta
>> >
>> >
>> >
>> > On 1 Mar, 13:42, Lukas Eder <[email protected]> wrote:
>> >> Hello Agharta,
>> >>
>> >> Please use the jooq-user group for support requests of this kind.
>> >> I cannot reproduce the issue you're mentioning by repetitively calling
>> >> something of this kind:
>> >>
>> >> Municipality.MUNICIPALITY.asTable().getFields()
>> >> Municipality.MUNICIPALITY.asTable().getFields()
>> >> Municipality.MUNICIPALITY.asTable().getFields()
>> >>
>> >> I always get the same list of fields. Beware that if you join two
>> >> tables, the resulting join table will contain all combined fields. I
>> >> suspect you join tables multiple times, which might lead to the issue
>> >> you're encountering. You will find some documentation about table
>> >> sources here:http://www.jooq.org/manual/DSL/TABLESOURCE/
>> >>
>> >> Also, note that jOOQ artefacts are NOT thread-safe. Furthermore, some
>> >> artefacts are NOT immutable. Maybe you are re-using a SelectQuery
>> >> object from a previous query?
>> >>
>> >> If you wish any further analysis on my side, please narrow down the
>> >> problematic code to the bit that is causing the problem. It is hard to
>> >> reproduce an issue from so much code.
>> >>
>> >> Cheers
>> >> Lukas
>> >>
>> >> 2012/3/1 agharta
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> > Hi Mr,
>> >> > I\'m using jooq in a complex system: Netbeans Platform +
>> >> > Openswing + Spring + H2.
>> >>
>> >> > I\'ve created a wrapper class thats auto create joins and
>> >> > conditions based on Openswing input.
>> >>
>> >> > But i\'ve a problem:
>> >> > For unknown reasons the call of
>> >> > UpdatableTable.Table.asTable.getFields() sometime returns me
>> >> > many fields, more than Table contains. (fields of other tables).
>> >>
>> >> > I send you the code of wrapper class and a little
>> >> > implementation, you can try it.
>> >>
>> >> > Sorry if i not post this into user group or bugtracking, but
>> >> > i want to known your opinion before creating a ticket.
>> >>
>> >> > THE WRAPPER CLASS (Sorry for the poor code):
>> >> > public class QueryComposerUtil {
>> >>
>> >> >    public static <R extends Record> SelectQuery
>> >> > compileQueryJoinOne(UpdatableTable<R> fromTable,
>> >> > List<Field<?>> returningFields, UpdatableTable<?> joinTable,
>> >> > JoinType joinType, Condition joinCondition, Map<String,
>> >> > Field<?>> replacementJoinFieldsNames,
>> >> > Collection<FilterWhereClause[]> filterWhereClauseList,
>> >> > List<String> currentSortedColumns, List<String>
>> >> > currentSortedColumnsVersus) {
>> >> >        List<UpdatableTable<?>> joinTables = new
>> >> > ArrayList<UpdatableTable<?>>();
>> >> >        List<JoinType> joinTypes = new ArrayList<JoinType>();
>> >> >        List<Condition> joinConditions = new
>> >> > ArrayList<Condition>();
>> >> >        joinTables.add(joinTable);
>> >> >        joinTypes.add(joinType);
>> >>
>> >> >        joinConditions.add(joinCondition);
>> >> >        return compileQueryJoin(fromTable, returningFields,
>> >> > joinTables, joinTypes, joinConditions,
>> >> > replacementJoinFieldsNames, filterWhereClauseList,
>> >> > currentSortedColumns, currentSortedColumnsVersus);
>> >> >    }
>> >>
>> >> >    public static <R extends Record> SelectQuery
>> >> > compileQueryJoin(UpdatableTable<R> fromTable, List<Field<?>>
>> >> > returningFields, List<UpdatableTable<?>> joinTables,
>> >> > List<JoinType> joinTypes, List<Condition> joinConditions,
>> >> > Map<String, Field<?>> replacementJoinFieldsNames,
>> >> > Collection<FilterWhereClause[]> filterWhereClauseList,
>> >> > List<String> currentSortedColumns, List<String>
>> >> > currentSortedColumnsVersus) {
>> >> >        PublicFactory vs = new
>> >> >
>> >> > PublicFactory((Connection)SpringLoader.getBean(\"datasourceConnection\"));
>> >>
>> >> >        SelectQuery sq = vs.selectQuery();
>> >> >        sq.addSelect(returningFields);
>> >> >        sq.addFrom(fromTable);
>> >> >        for (int x = 0; x < joinTables.size(); x++) {
>> >> >            sq.addJoin(joinTables.get(x), joinTypes.get(x),
>> >> > joinConditions.get(x));
>> >> >        }
>> >>
>> >> >        List<Field<?>> allFields =
>> >> > fromTable.asTable().getFields();
>> >> >        for (int x = 0; x < joinTables.size(); x++) {
>> >>
>> >> > allFields.addAll(joinTables.get(x).asTable().getFields());
>> >> >        }
>> >>
>> >> >        if (!filterWhereClauseList.isEmpty()) {
>> >> >            for (FilterWhereClause[] fwc :
>> >> > filterWhereClauseList) {
>> >> >                for (int i = 0; i < fwc.length; i++) {
>> >> >                    final FilterWhereClause fwc1 = fwc[i];
>> >> >                    if (fwc1 != null) {
>> >> >                        Field<?> f = null;
>> >> >                        //first, apply primary substitution
>> >> >                        if
>> >> > (replacementJoinFieldsNames.containsKey(fwc1.getAttributeName()))
>> >> > {
>> >> >                            f =
>> >> > replacementJoinFieldsNames.get(fwc1.getAttributeName());
>> >> >                        }
>> >>
>> >> >                        if (f == null) {
>> >> >                            //not found, use base
>> >> >                            f = getFieldByName(allFields,
>> >> > fwc1.getAttributeName());
>> >> >                        }
>> >> >                        if (f != null) {
>> >>
>> >> > prepareQuestionConditionsJoin(sq, Operator.AND,
>> >> > (TableField<?, Object>) f, fwc1.getOperator(), fwc1.getValue());
>> >> >                        }
>> >> >                    }
>> >> >                }
>> >> >            }
>> >> >        }
>> >>
>> >> >        if (!currentSortedColumns.isEmpty()) {
>> >> >            int x = 0;
>> >> >            for (String col : (List<String>)
>> >> > currentSortedColumns) {
>> >> >                String dir = (String)
>> >> > currentSortedColumnsVersus.get(x);
>> >> >                Field<?> f = null;
>> >> >                //first, apply primary substitution
>> >> >                if
>> >> > (replacementJoinFieldsNames.containsKey(col)) {
>> >> >                    f = replacementJoinFieldsNames.get(col);
>> >> >                }
>> >>
>> >> >                if (f == null) {
>> >> >                    //not found, use base
>> >> >                    f = getFieldByName(allFields, col);
>> >> >                }
>> >>
>> >> >                if (f != null) {
>> >> >                    prepareQuestionOrdeByJoin(sq,
>> >> > (TableField<?, Object>) f, dir);
>> >> >                }
>> >> >                x++;
>> >> >            }
>> >> >        }
>> >>
>> >> >        return sq;
>> >> >    }
>> >>
>> >> >    public static <R extends Record> SimpleSelectQuery<R>
>> >> > compileQuery(UpdatableTable<R> table,
>> >> > Collection<FilterWhereClause[]> filterWhereClauseList,
>> >> > List<String> currentSortedColumns, List<String>
>> >> > currentSortedColumnsVersus) {
>> >> >        PublicFactory vs = new
>> >> >
>> >> > PublicFactory((Connection)SpringLoader.getBean(\"datasourceConnection\"));
>> >> >        SimpleSelectQuery<R> qb = vs.selectQuery(table);
>> >> >        //ok, get fields from table
>> >>
>> >> >        List<Field<?>> allFields = table.asTable().getFields();
>> >>
>> >> >        if (!filterWhereClauseList.isEmpty()) {
>> >> >            for (FilterWhereClause[] fwc :
>> >> > filterWhereClauseList) {
>> >> >                for (int i = 0; i < fwc.length; i++) {
>> >> >                    FilterWhereClause fwc1 = fwc[i];
>> >> >                    if (fwc1 != null) {
>> >> >                        Field<?> f =
>> >> > getFieldByName(allFields, fwc1.getAttributeName());
>> >> >                        if (f != null) {
>> >> >                            prepareQuestionConditions(qb,
>> >> > Operator.AND, (TableField<?, Object>) f, fwc1.getOperator(),
>> >> > fwc1.getValue());
>> >> >                        }
>> >> >                    }
>> >> >                }
>> >> >            }
>> >> >        }
>> >>
>> >> >        if (!currentSortedColumns.isEmpty()) {
>> >> >            int x = 0;
>> >> >            for (String col : (List<String>)
>> >> > currentSortedColumns) {
>> >> >                String dir = (String)
>> >> > currentSortedColumnsVersus.get(x);
>> >> >                Field<?> f = getFieldByName(allFields, col);
>> >> >                if (f != null) {
>> >> >                    prepareQuestionOrdeBy(qb, (TableField<?,
>> >> > Object>) f, dir);
>> >> >                }
>> >> >                x++;
>> >> >            }
>> >> >        }
>> >>
>> >> >        return qb;
>> >> >    }
>> >>
>> >> >    private static Field<?> getFieldByName(List<Field<?>>
>> >> > allFields, final String name) {
>> >> >        Field<?> foundedFiled = (Field<?>)
>> >> > CollectionUtils.find(allFields, new Predicate() {
>> >> >            @Override
>> >> >            public boolean evaluate(Object o) {
>> >> >                return ((Field<?>)
>> >> > o).getName().trim().equalsIgnoreCase(name.trim());
>> >> >            }
>> >> >        });
>> >>
>> >> >        if (foundedFiled != null) {
>> >> >            return foundedFiled;
>> >> >        } else {
>> >> >            return null;
>> >> >        }
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionConditions(SimpleSelectQuery<?> ssq, Operator
>> >> > o, TableField<?, Object> field, String condition, Object
>> >> > valueToCompare) {
>> >>
>> >> >        if (condition != null && condition.trim().length() >
>> >> > 0) {
>> >> >            if (condition.equals(\">\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterThan(valueToCompare));
>> >> >            } else if (condition.equals(\">=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"<\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessThan(valueToCompare));
>> >> >            } else if (condition.equals(\"<=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.equal(valueToCompare));
>> >> >            } else if (condition.equals(\"is null\")) {
>> >> >                ssq.addConditions(o, field.isNull());
>> >> >            } else if (condition.equals(\"is not null\")) {
>> >> >                ssq.addConditions(o, field.isNotNull());
>> >> >            } else if (condition.equals(\"in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"not in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"<>\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.notEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"like\")) {
>> >> >                ssq.addConditions(o, field.like((String)
>> >> > valueToCompare));
>> >> >            }
>> >> >        }
>> >>
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionConditionsJoin(SelectQuery ssq, Operator o,
>> >> > TableField<?, Object> field, String condition, Object
>> >> > valueToCompare) {
>> >>
>> >> >        if (condition != null && condition.trim().length() >
>> >> > 0) {
>> >> >            if (condition.equals(\">\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterThan(valueToCompare));
>> >> >            } else if (condition.equals(\">=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"<\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessThan(valueToCompare));
>> >> >            } else if (condition.equals(\"<=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.equal(valueToCompare));
>> >> >            } else if (condition.equals(\"is null\")) {
>> >> >                ssq.addConditions(o, field.isNull());
>> >> >            } else if (condition.equals(\"is not null\")) {
>> >> >                ssq.addConditions(o, field.isNotNull());
>> >> >            } else if (condition.equals(\"in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"not in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"<>\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.notEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"like\")) {
>> >> >                ssq.addConditions(o, field.like((String)
>> >> > valueToCompare));
>> >> >            }
>> >> >        }
>> >>
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionOrdeBy(SimpleSelectQuery<?> ssq,
>> >> > TableField<?, Object> field, String direction) {
>> >> >        if (direction != null && direction.trim().length() >
>> >> > 0) {
>> >> >            ssq.addOrderBy(direction.equalsIgnoreCase(\"ASC\")
>> >> > ? field.asc() : field.desc());
>> >> >        }
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionOrdeByJoin(SelectQuery ssq, TableField<?,
>> >> > Object> field, String direction) {
>> >> >        if (direction != null && direction.trim().length() >
>> >> > 0) {
>> >> >            ssq.addOrderBy(direction.equalsIgnoreCase(\"ASC\")
>> >> > ? field.asc() : field.desc());
>> >> >        }
>> >> >    }
>> >> > }
>> >>
>> >> > NOW, the calling code:
>> >>
>> >> > Map<String, Field<?>> repMap = new HashMap<String, Field<?>>();
>> >> >            repMap.put(\"provinceId\", Province.PROVINCE.CODE);
>> >>
>> >> >            List<Field<?>> allfields =
>> >> > Municipality.MUNICIPALITY.asTable().getFields();
>> >> >            SelectQuery qb = new
>> >> > QueryComposerUtil().compileQueryJoinOne(Municipality.MUNICIPALITY,
>> >> >                   allfields, Province.PROVINCE,
>> >> >                    JoinType.LEFT_OUTER_JOIN,
>> >> > Municipality.MUNICIPALITY.PROVINCE_ID.equal(Province.PROVINCE.ID),
>> >> >                    repMap,
>> >> >                    filteredColumns.values(),
>> >> > currentSortedColumns, currentSortedVersusColumns);
>> >>
>> >> > The problem appears in
>> >> > Municipality.MUNICIPALITY.asTable().getFields();
>> >> > Remember: Province.PROVINCE has COUNTRY foreign key.
>> >> > If i call the joined table (Province.PROVINCE) in a separate
>> >> > call and next i call the previous code, I recive a error:
>> >>
>> >> > AbstractQuery.execute; SQL [select
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"ID\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"ISTAT_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CAP\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CADASTRE_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"ID\", \"PUBLIC\".\"PROVINCE\".\"CODE\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"COUNTRY_ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"CODE\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"DESCRIPTION\"
>> >> > from \"PUBLIC\".\"MUNICIPALITY\" left outer join
>> >> > \"PUBLIC\".\"PROVINCE\" on
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\"
>> >> > = \"PUBLIC\".\"PROVINCE\".\"ID\" order by
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\" desc]; Column
>> >> > \"PUBLIC.COUNTRY.ID\" not found; SQL statement:
>> >> > select \"PUBLIC\".\"MUNICIPALITY\".\"ID\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"ISTAT_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CAP\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CADASTRE_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"ID\", \"PUBLIC\".\"PROVINCE\".\"CODE\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"COUNTRY_ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"CODE\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"DESCRIPTION\"
>> >> > from \"PUBLIC\".\"MUNICIPALITY\" left outer join
>> >> > \"PUBLIC\".\"PROVINCE\" on
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\"
>> >> > = \"PUBLIC\".\"PROVINCE\".\"ID\" order by
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\" desc [42122-164]\' is
>> >> > not defined.
>> >>
>> >> > But, why \"PUBLIC\".\"COUNTRY\" is included into select query if
>> >> > i use List<Field<?>> allfields =
>> >> > Municipality.MUNICIPALITY.asTable().getFields() ???
>> >>
>> >> > I\'ve debugged
>> >> > Municipality.MUNICIPALITY.asTable().getFields() and i\'ve
>> >> > found that the getFields returns me all previous getted
>> >> > fields, from other tables. If i recall getFields, the
>> >> > returned list is exponentially moltiplicated!!!
>> >> > (100,200,400,800 times)
>> >>
>> >> > This mail could be strange. If you want i send you the
>> >> > entire netbeans project (it careate the db at runtime in
>> >> > home dir, but you can examite the source code yourself).
>> >>
>> >> > Feel free to ask me anything,
>> >>
>> >> > My directy mail is [email protected]
>> >>
>> >> > Best regards,
>> >>
>> >> > Agharta
>> >>
>> >> > --
>> >> > This message was sent to your SourceForge.net email alias via the web
>> >> > mail form.  You may reply to this message directly, or
>> >> > viahttps://sourceforge.net/sendmessage.php?touser=838732
>> >> > To update your email alias preferences, please
>> >> > visithttps://sourceforge.net/account
>
>
> Il giorno giovedì 1 marzo 2012 15:39:20 UTC+1, Lukas Eder ha scritto:
>>
>> Hello Agharta,
>>
>> You can attach files to mails to the user group
>>
>> Cheers
>> Lukas
>>
>> 2012/3/1 Agharta agharta <[email protected]>:
>> > Hi Mr Lukas Eder,
>> > Thank you for the quick reply.
>> >
>> > To find the problem, i've created a test case, with scripts and i have
>> > simulated the problem.
>> >
>> > How to send the test case zip file?
>> >
>> > Thank you,
>> >
>> > Agharta
>> >
>> >
>> >
>> > On 1 Mar, 13:42, Lukas Eder <[email protected]> wrote:
>> >> Hello Agharta,
>> >>
>> >> Please use the jooq-user group for support requests of this kind.
>> >> I cannot reproduce the issue you're mentioning by repetitively calling
>> >> something of this kind:
>> >>
>> >> Municipality.MUNICIPALITY.asTable().getFields()
>> >> Municipality.MUNICIPALITY.asTable().getFields()
>> >> Municipality.MUNICIPALITY.asTable().getFields()
>> >>
>> >> I always get the same list of fields. Beware that if you join two
>> >> tables, the resulting join table will contain all combined fields. I
>> >> suspect you join tables multiple times, which might lead to the issue
>> >> you're encountering. You will find some documentation about table
>> >> sources here:http://www.jooq.org/manual/DSL/TABLESOURCE/
>> >>
>> >> Also, note that jOOQ artefacts are NOT thread-safe. Furthermore, some
>> >> artefacts are NOT immutable. Maybe you are re-using a SelectQuery
>> >> object from a previous query?
>> >>
>> >> If you wish any further analysis on my side, please narrow down the
>> >> problematic code to the bit that is causing the problem. It is hard to
>> >> reproduce an issue from so much code.
>> >>
>> >> Cheers
>> >> Lukas
>> >>
>> >> 2012/3/1 agharta <[email protected]>:
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> > Hi Mr,
>> >> > I\'m using jooq in a complex system: Netbeans Platform +
>> >> > Openswing + Spring + H2.
>> >>
>> >> > I\'ve created a wrapper class thats auto create joins and
>> >> > conditions based on Openswing input.
>> >>
>> >> > But i\'ve a problem:
>> >> > For unknown reasons the call of
>> >> > UpdatableTable.Table.asTable.getFields() sometime returns me
>> >> > many fields, more than Table contains. (fields of other tables).
>> >>
>> >> > I send you the code of wrapper class and a little
>> >> > implementation, you can try it.
>> >>
>> >> > Sorry if i not post this into user group or bugtracking, but
>> >> > i want to known your opinion before creating a ticket.
>> >>
>> >> > THE WRAPPER CLASS (Sorry for the poor code):
>> >> > public class QueryComposerUtil {
>> >>
>> >> >    public static <R extends Record> SelectQuery
>> >> > compileQueryJoinOne(UpdatableTable<R> fromTable,
>> >> > List<Field<?>> returningFields, UpdatableTable<?> joinTable,
>> >> > JoinType joinType, Condition joinCondition, Map<String,
>> >> > Field<?>> replacementJoinFieldsNames,
>> >> > Collection<FilterWhereClause[]> filterWhereClauseList,
>> >> > List<String> currentSortedColumns, List<String>
>> >> > currentSortedColumnsVersus) {
>> >> >        List<UpdatableTable<?>> joinTables = new
>> >> > ArrayList<UpdatableTable<?>>();
>> >> >        List<JoinType> joinTypes = new ArrayList<JoinType>();
>> >> >        List<Condition> joinConditions = new
>> >> > ArrayList<Condition>();
>> >> >        joinTables.add(joinTable);
>> >> >        joinTypes.add(joinType);
>> >>
>> >> >        joinConditions.add(joinCondition);
>> >> >        return compileQueryJoin(fromTable, returningFields,
>> >> > joinTables, joinTypes, joinConditions,
>> >> > replacementJoinFieldsNames, filterWhereClauseList,
>> >> > currentSortedColumns, currentSortedColumnsVersus);
>> >> >    }
>> >>
>> >> >    public static <R extends Record> SelectQuery
>> >> > compileQueryJoin(UpdatableTable<R> fromTable, List<Field<?>>
>> >> > returningFields, List<UpdatableTable<?>> joinTables,
>> >> > List<JoinType> joinTypes, List<Condition> joinConditions,
>> >> > Map<String, Field<?>> replacementJoinFieldsNames,
>> >> > Collection<FilterWhereClause[]> filterWhereClauseList,
>> >> > List<String> currentSortedColumns, List<String>
>> >> > currentSortedColumnsVersus) {
>> >> >        PublicFactory vs = new
>> >> >
>> >> > PublicFactory((Connection)SpringLoader.getBean(\"datasourceConnection\"));
>> >>
>> >> >        SelectQuery sq = vs.selectQuery();
>> >> >        sq.addSelect(returningFields);
>> >> >        sq.addFrom(fromTable);
>> >> >        for (int x = 0; x < joinTables.size(); x++) {
>> >> >            sq.addJoin(joinTables.get(x), joinTypes.get(x),
>> >> > joinConditions.get(x));
>> >> >        }
>> >>
>> >> >        List<Field<?>> allFields =
>> >> > fromTable.asTable().getFields();
>> >> >        for (int x = 0; x < joinTables.size(); x++) {
>> >>
>> >> > allFields.addAll(joinTables.get(x).asTable().getFields());
>> >> >        }
>> >>
>> >> >        if (!filterWhereClauseList.isEmpty()) {
>> >> >            for (FilterWhereClause[] fwc :
>> >> > filterWhereClauseList) {
>> >> >                for (int i = 0; i < fwc.length; i++) {
>> >> >                    final FilterWhereClause fwc1 = fwc[i];
>> >> >                    if (fwc1 != null) {
>> >> >                        Field<?> f = null;
>> >> >                        //first, apply primary substitution
>> >> >                        if
>> >> > (replacementJoinFieldsNames.containsKey(fwc1.getAttributeName()))
>> >> > {
>> >> >                            f =
>> >> > replacementJoinFieldsNames.get(fwc1.getAttributeName());
>> >> >                        }
>> >>
>> >> >                        if (f == null) {
>> >> >                            //not found, use base
>> >> >                            f = getFieldByName(allFields,
>> >> > fwc1.getAttributeName());
>> >> >                        }
>> >> >                        if (f != null) {
>> >>
>> >> > prepareQuestionConditionsJoin(sq, Operator.AND,
>> >> > (TableField<?, Object>) f, fwc1.getOperator(), fwc1.getValue());
>> >> >                        }
>> >> >                    }
>> >> >                }
>> >> >            }
>> >> >        }
>> >>
>> >> >        if (!currentSortedColumns.isEmpty()) {
>> >> >            int x = 0;
>> >> >            for (String col : (List<String>)
>> >> > currentSortedColumns) {
>> >> >                String dir = (String)
>> >> > currentSortedColumnsVersus.get(x);
>> >> >                Field<?> f = null;
>> >> >                //first, apply primary substitution
>> >> >                if
>> >> > (replacementJoinFieldsNames.containsKey(col)) {
>> >> >                    f = replacementJoinFieldsNames.get(col);
>> >> >                }
>> >>
>> >> >                if (f == null) {
>> >> >                    //not found, use base
>> >> >                    f = getFieldByName(allFields, col);
>> >> >                }
>> >>
>> >> >                if (f != null) {
>> >> >                    prepareQuestionOrdeByJoin(sq,
>> >> > (TableField<?, Object>) f, dir);
>> >> >                }
>> >> >                x++;
>> >> >            }
>> >> >        }
>> >>
>> >> >        return sq;
>> >> >    }
>> >>
>> >> >    public static <R extends Record> SimpleSelectQuery<R>
>> >> > compileQuery(UpdatableTable<R> table,
>> >> > Collection<FilterWhereClause[]> filterWhereClauseList,
>> >> > List<String> currentSortedColumns, List<String>
>> >> > currentSortedColumnsVersus) {
>> >> >        PublicFactory vs = new
>> >> >
>> >> > PublicFactory((Connection)SpringLoader.getBean(\"datasourceConnection\"));
>> >> >        SimpleSelectQuery<R> qb = vs.selectQuery(table);
>> >> >        //ok, get fields from table
>> >>
>> >> >        List<Field<?>> allFields = table.asTable().getFields();
>> >>
>> >> >        if (!filterWhereClauseList.isEmpty()) {
>> >> >            for (FilterWhereClause[] fwc :
>> >> > filterWhereClauseList) {
>> >> >                for (int i = 0; i < fwc.length; i++) {
>> >> >                    FilterWhereClause fwc1 = fwc[i];
>> >> >                    if (fwc1 != null) {
>> >> >                        Field<?> f =
>> >> > getFieldByName(allFields, fwc1.getAttributeName());
>> >> >                        if (f != null) {
>> >> >                            prepareQuestionConditions(qb,
>> >> > Operator.AND, (TableField<?, Object>) f, fwc1.getOperator(),
>> >> > fwc1.getValue());
>> >> >                        }
>> >> >                    }
>> >> >                }
>> >> >            }
>> >> >        }
>> >>
>> >> >        if (!currentSortedColumns.isEmpty()) {
>> >> >            int x = 0;
>> >> >            for (String col : (List<String>)
>> >> > currentSortedColumns) {
>> >> >                String dir = (String)
>> >> > currentSortedColumnsVersus.get(x);
>> >> >                Field<?> f = getFieldByName(allFields, col);
>> >> >                if (f != null) {
>> >> >                    prepareQuestionOrdeBy(qb, (TableField<?,
>> >> > Object>) f, dir);
>> >> >                }
>> >> >                x++;
>> >> >            }
>> >> >        }
>> >>
>> >> >        return qb;
>> >> >    }
>> >>
>> >> >    private static Field<?> getFieldByName(List<Field<?>>
>> >> > allFields, final String name) {
>> >> >        Field<?> foundedFiled = (Field<?>)
>> >> > CollectionUtils.find(allFields, new Predicate() {
>> >> >            @Override
>> >> >            public boolean evaluate(Object o) {
>> >> >                return ((Field<?>)
>> >> > o).getName().trim().equalsIgnoreCase(name.trim());
>> >> >            }
>> >> >        });
>> >>
>> >> >        if (foundedFiled != null) {
>> >> >            return foundedFiled;
>> >> >        } else {
>> >> >            return null;
>> >> >        }
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionConditions(SimpleSelectQuery<?> ssq, Operator
>> >> > o, TableField<?, Object> field, String condition, Object
>> >> > valueToCompare) {
>> >>
>> >> >        if (condition != null && condition.trim().length() >
>> >> > 0) {
>> >> >            if (condition.equals(\">\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterThan(valueToCompare));
>> >> >            } else if (condition.equals(\">=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"<\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessThan(valueToCompare));
>> >> >            } else if (condition.equals(\"<=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.equal(valueToCompare));
>> >> >            } else if (condition.equals(\"is null\")) {
>> >> >                ssq.addConditions(o, field.isNull());
>> >> >            } else if (condition.equals(\"is not null\")) {
>> >> >                ssq.addConditions(o, field.isNotNull());
>> >> >            } else if (condition.equals(\"in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"not in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"<>\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.notEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"like\")) {
>> >> >                ssq.addConditions(o, field.like((String)
>> >> > valueToCompare));
>> >> >            }
>> >> >        }
>> >>
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionConditionsJoin(SelectQuery ssq, Operator o,
>> >> > TableField<?, Object> field, String condition, Object
>> >> > valueToCompare) {
>> >>
>> >> >        if (condition != null && condition.trim().length() >
>> >> > 0) {
>> >> >            if (condition.equals(\">\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterThan(valueToCompare));
>> >> >            } else if (condition.equals(\">=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.greaterOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"<\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessThan(valueToCompare));
>> >> >            } else if (condition.equals(\"<=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.lessOrEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"=\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.equal(valueToCompare));
>> >> >            } else if (condition.equals(\"is null\")) {
>> >> >                ssq.addConditions(o, field.isNull());
>> >> >            } else if (condition.equals(\"is not null\")) {
>> >> >                ssq.addConditions(o, field.isNotNull());
>> >> >            } else if (condition.equals(\"in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"not in\")) {
>> >> >                ssq.addConditions(o, field.in(valueToCompare));
>> >> >            } else if (condition.equals(\"<>\")) {
>> >> >                ssq.addConditions(o,
>> >> > field.notEqual(valueToCompare));
>> >> >            } else if (condition.equals(\"like\")) {
>> >> >                ssq.addConditions(o, field.like((String)
>> >> > valueToCompare));
>> >> >            }
>> >> >        }
>> >>
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionOrdeBy(SimpleSelectQuery<?> ssq,
>> >> > TableField<?, Object> field, String direction) {
>> >> >        if (direction != null && direction.trim().length() >
>> >> > 0) {
>> >> >            ssq.addOrderBy(direction.equalsIgnoreCase(\"ASC\")
>> >> > ? field.asc() : field.desc());
>> >> >        }
>> >> >    }
>> >>
>> >> >    private static void
>> >> > prepareQuestionOrdeByJoin(SelectQuery ssq, TableField<?,
>> >> > Object> field, String direction) {
>> >> >        if (direction != null && direction.trim().length() >
>> >> > 0) {
>> >> >            ssq.addOrderBy(direction.equalsIgnoreCase(\"ASC\")
>> >> > ? field.asc() : field.desc());
>> >> >        }
>> >> >    }
>> >> > }
>> >>
>> >> > NOW, the calling code:
>> >>
>> >> > Map<String, Field<?>> repMap = new HashMap<String, Field<?>>();
>> >> >            repMap.put(\"provinceId\", Province.PROVINCE.CODE);
>> >>
>> >> >            List<Field<?>> allfields =
>> >> > Municipality.MUNICIPALITY.asTable().getFields();
>> >> >            SelectQuery qb = new
>> >> > QueryComposerUtil().compileQueryJoinOne(Municipality.MUNICIPALITY,
>> >> >                   allfields, Province.PROVINCE,
>> >> >                    JoinType.LEFT_OUTER_JOIN,
>> >> > Municipality.MUNICIPALITY.PROVINCE_ID.equal(Province.PROVINCE.ID),
>> >> >                    repMap,
>> >> >                    filteredColumns.values(),
>> >> > currentSortedColumns, currentSortedVersusColumns);
>> >>
>> >> > The problem appears in
>> >> > Municipality.MUNICIPALITY.asTable().getFields();
>> >> > Remember: Province.PROVINCE has COUNTRY foreign key.
>> >> > If i call the joined table (Province.PROVINCE) in a separate
>> >> > call and next i call the previous code, I recive a error:
>> >>
>> >> > AbstractQuery.execute; SQL [select
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"ID\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"ISTAT_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CAP\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CADASTRE_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"ID\", \"PUBLIC\".\"PROVINCE\".\"CODE\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"COUNTRY_ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"CODE\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"DESCRIPTION\"
>> >> > from \"PUBLIC\".\"MUNICIPALITY\" left outer join
>> >> > \"PUBLIC\".\"PROVINCE\" on
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\"
>> >> > = \"PUBLIC\".\"PROVINCE\".\"ID\" order by
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\" desc]; Column
>> >> > \"PUBLIC.COUNTRY.ID\" not found; SQL statement:
>> >> > select \"PUBLIC\".\"MUNICIPALITY\".\"ID\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"ISTAT_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CAP\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"CADASTRE_CODE\",
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"ID\", \"PUBLIC\".\"PROVINCE\".\"CODE\",
>> >> > \"PUBLIC\".\"PROVINCE\".\"COUNTRY_ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"ID\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"CODE\",
>> >> > \"PUBLIC\".\"COUNTRY\".\"DESCRIPTION\"
>> >> > from \"PUBLIC\".\"MUNICIPALITY\" left outer join
>> >> > \"PUBLIC\".\"PROVINCE\" on
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"PROVINCE_ID\"
>> >> > = \"PUBLIC\".\"PROVINCE\".\"ID\" order by
>> >> > \"PUBLIC\".\"MUNICIPALITY\".\"DESCRIPTION\" desc [42122-164]\' is
>> >> > not defined.
>> >>
>> >> > But, why \"PUBLIC\".\"COUNTRY\" is included into select query if
>> >> > i use List<Field<?>> allfields =
>> >> > Municipality.MUNICIPALITY.asTable().getFields() ???
>> >>
>> >> > I\'ve debugged
>> >> > Municipality.MUNICIPALITY.asTable().getFields() and i\'ve
>> >> > found that the getFields returns me all previous getted
>> >> > fields, from other tables. If i recall getFields, the
>> >> > returned list is exponentially moltiplicated!!!
>> >> > (100,200,400,800 times)
>> >>
>> >> > This mail could be strange. If you want i send you the
>> >> > entire netbeans project (it careate the db at runtime in
>> >> > home dir, but you can examite the source code yourself).
>> >>
>> >> > Feel free to ask me anything,
>> >>
>> >> > My directy mail is [email protected]
>> >>
>> >> > Best regards,
>> >>
>> >> > Agharta
>> >>
>> >> > --
>> >> > This message was sent to your SourceForge.net email alias via the web
>> >> > mail form.  You may reply to this message directly, or
>> >> > viahttps://sourceforge.net/sendmessage.php?touser=838732
>> >> > To update your email alias preferences, please
>> >> > visithttps://sourceforge.net/account

Reply via email to