dev@glassfish.java.net

Re: setFirstResult in conjunction with setMaxResults returns too much results

From: Tom Ware <tom.ware_at_oracle.com>
Date: Fri, 05 Jan 2007 12:59:42 -0500

Hi Markus,

  I don't have the exact JDBC handy, but here's an approximation based
on a JDBC example I have on my machine

- get a connection eg:
// Load the database driver
Class.forName( "oracle.jdbc.driver.OracleDriver" ) ;

// Get a connection to the database
// Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl",
"scott", "tiger") ;

- create a Prepared Statement
PreparedStatement stmt = conn.prepareStatement("select * from mytable",
java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE);

- set max rows
stmt.setMaxRows(<maxrows>);

- execute
 boolean result = stmt.execute("Select SQL_DATE from CMP3_DATE_TIME");

- get the result set

ResultSet rs = stmt.getResultSet();

- cal absolute

rs.absolute(<firstresult>)

Then take a look at the results.

-Tom


Markus KARG wrote:

>Michael,
>
>I checked it again -- sorry I did a typo: It is 15 results in common,
>then applying setFirstResult(2) in conjunction with setMaxResults(12)
>but not (14) as I write before -- but I am getting still 13 results,
>which is one more than twelve. So actually it is NOT a bug in the unit
>test, but a bug somewhere in TopLink or in the JDBC driver.
>
>Tom, can you please write five short code lines what you want me to
>check with the JDBC driver?
>
>Thanks
>Markus
>
>Markus KARG schrieb:
>
>
>>Michael,
>>
>>you are definitively right! Following the official description of
>>setMaxResults in the EJB 3.0 JPA specification, the SQLAnywhere driver
>>is working absolutely correct, while the expected result in the test
>>is false!
>>
>>So I will file a bug report for that.
>>
>>Thanks a lot!
>>Markus
>>
>>Michael Bouschen schrieb:
>>
>>
>>>Hi Markus, hi Tom,
>>>
>>>please correct me if I'm wrong, but I think returning 13 instances
>>>for the third test is the correct query result. The description of
>>>method setMaxResult in the spec says: "Set the maximum number of
>>>results to retrieve.". I read this that setMaxResult specifies the
>>>size of the query result and not the index of the last result
>>>element. The third test case calls query.setFirstResult(2) and
>>>query.setMaxResults(14). So it is specified to return at most 14
>>>instances. But there are only 13 rows left when firstResult is
>>>specified as 2 (the numbering starts at 0).
>>>
>>>What do you think?
>>>
>>>Regards Michael
>>>
>>>
>>>
>>>>Hi Markus,
>>>>
>>>> There has actually been some recent discussion on the mailing list
>>>>about setFirstResult() and setMaxResult(). Here's how they work:
>>>>
>>>>The current implementation of setFirstResult() and setMaxResult() make
>>>>use of JDBC constructs rather than RDBMS constructs.
>>>>
>>>>For setMaxResult() we call the java.sql.Statement.setMaxRows(int)
>>>>method.
>>>>
>>>>For setFirstResult() we make use of the ResultSet that is returned in
>>>>JDBC. If firstResult is set, we build query that returns a
>>>>TYPE_SCROLL_INSENSITIVE ResultSet and call resultSet.absolute(int) on
>>>>that result set.
>>>>
>>>>Is it possible the result for the SQLAnywhere driver is not what we
>>>>expect?
>>>>
>>>>-Tom
>>>>
>>>>
>>>>Markus KARG wrote:
>>>>
>>>>
>>>>
>>>>>When I was implementing the SQLAnywhere platform I remarked a
>>>>>failing test: complexResultPropertiesTest. That test tries three
>>>>>things: setFirstResult, setMaxResult and a combination of both. The
>>>>>used table holds 15 row. The first test (setFirstResult(2)) return
>>>>>13 rows (what is correct, since 15-2=13). The second test
>>>>>(setMaxResults(15-1)) returns 14 rows (what is correct, since
>>>>>15-1=14). But the third test fails. The correct result would be to
>>>>>return 12 rows (= 15-2-1). But the actual result is 13 rows!
>>>>>
>>>>>I have not seen any faulty SQL (in fact, it seems that TopLink does
>>>>>this internally -- it does not apply any "SELECT TOP START AT"
>>>>>range constraints to the SQL, but seems to process the range
>>>>>constraints internally.
>>>>>
>>>>>So did I detect a bug in TopLink, or where is there a fault in my
>>>>>platform implementation?
>>>>>
>>>>>Thanks
>>>>>Markus
>>>>>
>>>>>
>>>>>
>>>>>
>>>>---------------------------------------------------------------------
>>>>To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>
>>>>
>>>>
>>>---------------------------------------------------------------------
>>>To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>
>>>
>>>
>
>
>