You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by Maciej Regulski <mr...@go2.pl> on 2003/12/16 10:51:02 UTC
serialization of an Object[] array and LIMIT option implementation
Hi,
I'm very beginer to OJB. I've got two questions.
Are you going to fix org.apache.ojb.broker.core.PersistenceBrokerImpl class
code to suport storing m:n relations implemented as an Object[] array?
I tried to patch it my self and finaly I got to this point when I had to
convert array of persistent object to Vector to avoid
java.lang.ClassCastException, but I don't think it is a good solution.
PersistenceBrokerImpl::storeCollections:
[..]
if (cds.isMtoNRelation())
{
currentMtoNKeys = getMtoNImplementor(cds, obj);
// delete unused m:n implementors
//try-catch implementation added by Mathias for escape
from ClassCastException
try {
deleteMtoNImplementor(cds, obj, (Collection)col,
currentMtoNKeys);
} catch (ClassCastException cce) {
if (col.getClass().isArray()) {
System.out.println("::IF ENTERED");
deleteMtoNImplementor(cds, obj,
(Collection)pl.ojb.tools.Array2Vector.Convert((Object[])col),
currentMtoNKeys);
}
}
[..]
And second question is connected with buiding SELECT statement. I know that
LIMIT option is specific for each database, but getting whole record set
from db server every time is a disaster. Espetially when you have thousands
of records in your sql tables. And again I had to interfere in OJB source
code:
org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement:getStatement
[..]
appendOrderByClause(orderByFields, orderByColumnNumbers, stmt);
/**
* PostgreSQL only LIMIT implementation
* if the query has specified a start at index, and an end at index move to
the start at index.
*/
int startAt = query.getStartAtIndex();
int endAt = query.getEndAtIndex();
if (startAt > 0) {
stmt.append(" OFFSET "+String.valueOf(startAt));
}
if (endAt > 0) {
int numberOfObjectsToFetch = endAt;
if (startAt > 0) numberOfObjectsToFetch =
numberOfObjectsToFetch - startAt;
stmt.append(" LIMIT "+String.valueOf(endAt));
}
return stmt.toString();
It works fine for me, but now I had to change db server to MySQL. :>
So is there any chance to have this issues solved with next version of
OJB???
Rgds
Mathias <ma...@irc.pl>
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org
Re: serialization of an Object[] array and LIMIT option implementation
Posted by Jakob Braeuchi <jb...@gmx.ch>.
hi maciej,
the LIMIT is supported by use of the PagingIterator. OJB still reads the
whole resultset but positions the cursor to the desired position. see
Query.setStartAt / setEndAt.
i also experimented with SQL-Paging (see the Platforms). this solution
worked, but the drawback is the way OJB supports extents: 1 select for
each extent.
jakob
Maciej Regulski wrote:
> Hi,
> I'm very beginer to OJB. I've got two questions.
> Are you going to fix org.apache.ojb.broker.core.PersistenceBrokerImpl class
> code to suport storing m:n relations implemented as an Object[] array?
> I tried to patch it my self and finaly I got to this point when I had to
> convert array of persistent object to Vector to avoid
> java.lang.ClassCastException, but I don't think it is a good solution.
>
> PersistenceBrokerImpl::storeCollections:
>
> [..]
> if (cds.isMtoNRelation())
> {
> currentMtoNKeys = getMtoNImplementor(cds, obj);
> // delete unused m:n implementors
> //try-catch implementation added by Mathias for escape
> from ClassCastException
> try {
> deleteMtoNImplementor(cds, obj, (Collection)col,
> currentMtoNKeys);
> } catch (ClassCastException cce) {
> if (col.getClass().isArray()) {
> System.out.println("::IF ENTERED");
> deleteMtoNImplementor(cds, obj,
> (Collection)pl.ojb.tools.Array2Vector.Convert((Object[])col),
> currentMtoNKeys);
> }
> }
> [..]
>
> And second question is connected with buiding SELECT statement. I know that
> LIMIT option is specific for each database, but getting whole record set
> from db server every time is a disaster. Espetially when you have thousands
> of records in your sql tables. And again I had to interfere in OJB source
> code:
> org.apache.ojb.broker.accesslayer.sql.SqlSelectStatement:getStatement
>
> [..]
> appendOrderByClause(orderByFields, orderByColumnNumbers, stmt);
> /**
> * PostgreSQL only LIMIT implementation
> * if the query has specified a start at index, and an end at index move to
> the start at index.
> */
> int startAt = query.getStartAtIndex();
> int endAt = query.getEndAtIndex();
> if (startAt > 0) {
> stmt.append(" OFFSET "+String.valueOf(startAt));
> }
> if (endAt > 0) {
> int numberOfObjectsToFetch = endAt;
> if (startAt > 0) numberOfObjectsToFetch =
> numberOfObjectsToFetch - startAt;
> stmt.append(" LIMIT "+String.valueOf(endAt));
> }
> return stmt.toString();
>
> It works fine for me, but now I had to change db server to MySQL. :>
>
>
> So is there any chance to have this issues solved with next version of
> OJB???
> Rgds
> Mathias <ma...@irc.pl>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org