hi Jo�o,

thanks for your testcase.
i commited a patch to SqlQueryStatement.
the sql produced is now as follows:


SELECT A0.idInternal,A0.name FROM A A0 INNER JOIN AB A1 ON A0.idInternal=A1.keyA INNER JOIN B A2 ON A1.keyB=A2.idInternal INNER JOIN C A3 ON A2.idInternal=A3.keyB INNER JOIN D A4 ON A2.idInternal=A4.keyB WHERE (A3.idInternal = '101' ) AND A4.idInternal = '202'

thanks

jakob

Jo�o Luz wrote:

I'm using rc1 version.

-----Original Message-----
From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
Sent: quarta-feira, 2 de Abril de 2003 18:06
To: OJB Users List
Subject: Re: Invalid argument value: Not unique table/alias: 'A1'


hi Jo�o,


what version of ojb do you use ?

jakob

Jo�o Luz wrote:



Hi,

Look to this simple case:
        A --- AB --- B ---- C
                         |
                         D
1- A got a M:N relation with B
2 - B got a 1:M to C and D

The M:N relationship is implemented with collections (indirection-table


AB).


If I want to get "All A's that have B's associated that have C's and D's
with some property equals to something", i.e, if I do this OQL query:
        select all from  A.class.getName() where bs.cs.idInternal = $1 and
bs.ds.idInternal = $2

The execution result of this query is this:
        SELECT A0.name,A0.idInternal
                FROM A A0 INNER JOIN AB A1 ON A0.idInternal=A1.keyA
                        INNER JOIN B A2 ON A1.keyB=A2.idInternal
                        INNER JOIN AB A1 ON  A0.idInternal=A1.keyA
                        INNER JOIN B A2 ON A1.keyB=A2.idInternal
                WHERE ( A2.idInternal =  ? ) AND  (A2.idInternal =  ? )

Well this don't works because A1 alias is duplicated. The error tells me
that:
ERROR [main] (?:?) - SQLException during the execution of the query (for a
A): Invalid argument value: Not unique table/alias: 'A1'
java.sql.SQLException: Invalid argument value: Not unique table/alias: 'A1'
at com.mysql.jdbc.MysqlIO.sendCommand(Unknown Source)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(Unknown Source)
at com.mysql.jdbc.Connection.execSQL(Unknown Source)
at com.mysql.jdbc.PreparedStatement.executeQuery(Unknown Source)
at org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(Unknown
Source)
at org.apache.ojb.broker.accesslayer.RsIterator.<init>(Unknown Source)
at
org.apache.ojb.broker.singlevm.RsIteratorFactoryImpl.createRsIterator(Unkno


w


n Source)
at
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getRsIteratorFromQuery


(


Unknown Source)
at
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getIteratorFromQuery(U


n


known Source)
at
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(U


n


known Source)
at
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(U


n


known Source)
at
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(U


n


known Source)
at
org.apache.ojb.broker.singlevm.DelegatingPersistenceBroker.getCollectionByQ


u


ery(Unknown Source)
        at org.apache.ojb.odmg.oql.OQLQueryImpl.execute(Unknown Source)
        at Main.main(Main.java:54)

Well, my question is: Am I doing something wrong or sqlGenerator got a
bug/feature? :)

Thanks in advance
        Jo�o

PS: Mapping is below:

<class-descriptor class="A" table="A">
  <field-descriptor
      name="idInternal"
      column="idInternal"
      jdbc-type="INTEGER"
      primarykey="true"
      autoincrement="true"
      id="1"
  />
  <field-descriptor
      name="name"
      column="name"
      jdbc-type="VARCHAR"/>
    <collection-descriptor name="bs" element-class-ref="B"
indirection-table="AB">
                <fk-pointing-to-this-class  column="keyA" />
        <fk-pointing-to-element-class column="keyB" />
          </collection-descriptor>
</class-descriptor>
<class-descriptor class="B" table="B">
  <field-descriptor name="idInternal" column="idInternal"
jdbc-type="INTEGER" primarykey="true" autoincrement="true"/>


<field-descriptor name="name" column="name" jdbc-type="VARCHAR"/>


          <collection-descriptor name="cs" element-class-ref="C" proxy="true">
                <inverse-foreignkey field-ref="idB"/>
          </collection-descriptor>
          <collection-descriptor name="ds" element-class-ref="D" proxy="true">
             <inverse-foreignkey field-ref="idB"/>
          </collection-descriptor>
    <collection-descriptor name="as" element-class-ref="A"
indirection-table="AB">
                <fk-pointing-to-this-class  column="keyB" />
                <fk-pointing-to-element-class column="keyA" />
        </collection-descriptor>
</class-descriptor>

<class-descriptor class="C"
                table="C">
  <field-descriptor
      name="idInternal"
      column="idInternal"
      jdbc-type="INTEGER"
      primarykey="true"
      autoincrement="true"
  />

<field-descriptor name="idB" column="keyB" jdbc-type="INTEGER"/>

    <reference-descriptor name="b" class-ref="B">
       <foreignkey field-ref="keyB"/>
    </reference-descriptor>

</class-descriptor>

<class-descriptor class="D" table="D">
  <field-descriptor
      name="idInternal"
      column="idInternal"
      jdbc-type="INTEGER"
      primarykey="true"
      autoincrement="true"
  />

  <field-descriptor name="idB" column="keyB" jdbc-type="INTEGER"/>
    <reference-descriptor name="b" class-ref="B">
       <foreignkey field-ref="idB"/>
    </reference-descriptor>
</class-descriptor>

PS2:Now the database sql:
/*
Mascon Dump
Source Host:           localhost
Source Server Version: 3.23.53-max-nt
Source Database:       testDB
Date:                  2003-04-01 11:35:58
*/

use testDB ;
#----------------------------
# Table structure for A
#----------------------------
drop table if exists A;
create table A (
 idInternal int(11) not null default '0',
 name varchar(50) not null,
 primary key (idInternal))
 type=MyISAM;

#----------------------------
# Table structure for AB
#----------------------------
drop table if exists AB;
create table AB (
 keyA int(11) not null default '0',
 keyB int(11) not null default '0')
 type=MyISAM;

#----------------------------
# Table structure for B
#----------------------------
drop table if exists B;
create table B (
 idInternal int(11) not null default '0',
 keyA int(11) not null default '0',
 name varchar(50) not null,
 primary key (idInternal))
 type=MyISAM;

#----------------------------
# Table structure for C
#----------------------------
drop table if exists C;
create table C (
 idInternal int(11) not null default '0',
 keyB int(11) not null default '0',
 primary key (idInternal))
 type=MyISAM;

#----------------------------
# Table structure for D
#----------------------------
drop table if exists D;
create table D (
 idInternal int(11) not null default '0',
 keyB int(11) not null default '0',
 primary key (idInternal))
 type=MyISAM;



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]








---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to