Hi Roman,

AFAIK, the subquery *may* be executed as a separate query (because of
extents) so the dependent attributes get a little tricky and may not be
supported.  But that being said and done, there are some errors in your
code.

Criteria.addEqualToColumn("ColumnName", "ColumnName") expects two column
names.
Criteria.addEqualToField("FieldName", "FieldName") expects two field
names (mapped to column names).
Criteria.addEqualTo("AttributeName", Value) expects a field name (mapped
to a column name, but will accept a column name) and a value to build a
where clause.

So maybe something like this would work:

        broker = PersistenceBrokerFactory.defaultPersistenceBroker();
        // Build sub query for effdt logic
      ReportQueryByCriteria subQry = null;
      subCrit.addEqualTo("EMPLID", "0000005170"); 
      subCrit.addEqualTo("NAME_TYPE", "PRF");
      subQry = QueryFactory.newReportQuery(PsNames.class, subCrit);
      subQry.setAttributes(new String[] {"MAX(EFFDT)"});
        
      // Build main query
      crit.addIn("EFFDT", subQry);
      crit.addEqualTo("EMPLID", "0000005170");
      crit.addEqualTo("NAME_TYPE", "PRF");
      
        // Execute  
      Query mainQry = QueryFactory.newQuery(PsNames.class, crit);
      Collection results = broker.getCollectionByQuery(mainQry);

-----Original Message-----
From: Stark, Roman [mailto:[EMAIL PROTECTED] 
Sent: Monday, November 22, 2004 8:13 AM
To: OJB Users List
Cc: Stark, Roman
Subject: OJB sub query with effective date and effective sequence logic


Hi All

I am evaluating OJBs functionality for our project.  Currently most of
the sql is written by hand since it's complex logic against People Soft
(ERP) tables.  
Right now I am trying to use sub query to query data from just one table
based on effective dates.  The sql I want to create is:

SELECT * FROM ps_names a
WHERE a.emplid = '0000005170' AND a.name_type = 'PRF'
AND a.effdt = (SELECT MAX(b.effdt) FROM ps_names b WHERE a.emplid =
b.emplid AND a.name_type = b.name_type)

The code I wrote (think it would work) is:

        broker = PersistenceBrokerFactory.defaultPersistenceBroker();
        // Build sub query for effdt logic
      ReportQueryByCriteria subQry = null;
      subCrit.addEqualToField("EMPLID", Criteria.PARENT_QUERY_PREFIX +
"EMPLID"); 
      subCrit.addEqualToField("NAME_TYPE", Criteria.PARENT_QUERY_PREFIX
+ "NAME_TYPE");
      subQry = QueryFactory.newReportQuery(PsNames.class, subCrit);
      subQry.setAttributes(new String[] {"MAX(EFFDT)"});
        
      // Build main query
      crit.addColumnEqualTo("EFFDT", subQry);
      crit.addColumnEqualTo("EMPLID", "0000005170");
      crit.addColumnEqualTo("NAME_TYPE", "PRF");
      
        // Execute  
      Query mainQry = QueryFactory.newQuery(PsNames.class, crit);
      Collection results = broker.getCollectionByQuery(mainQry);

Unfortunately, the result is nothing.

Table definition:

EMPLID  N       VARCHAR2        11      Primary key
NAME_TYPE       N       VARCHAR2        3       Primary key             
EFFDT   N       DATE    7                       Primary key
FIRST_NAME      N       VARCHAR2        30                      
MIDDLE_NAME     N       VARCHAR2        30                      
LAST_NAME       N       VARCHAR2        30                      
NAME            N       VARCHAR2        50                      
...

What am I missing?  Am I not using the sub query right?  This is only a
simple table that doesn't contain an effective sequence in addition to
the effective date, let alone joining two tables both with effective
date and sequence logic.

Any ideas are appreciated.
Thanks
Roman


---------------------------------------------------------------------
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