lallemand created CAY-2895:
------------------------------
Summary: Incorrect Lazy Pagination Comparison for BigInteger PK
Key: CAY-2895
URL: https://issues.apache.org/jira/browse/CAY-2895
Project: Cayenne
Issue Type: Bug
Components: Core Library
Affects Versions: 4.2.2
Reporter: lallemand
Fix For: 4.2.3
Attachments: image-2025-09-01-14-24-18-956.png,
image-2025-09-01-14-24-41-442.png, image-2025-09-01-14-26-02-296.png,
image-2025-09-01-14-26-35-313.png, image-2025-09-01-14-26-45-722.png,
image-2025-09-01-14-27-06-177.png, image-2025-09-01-14-27-12-756.png,
image-2025-09-01-14-27-27-432.png
Dears,
In the latest stable version ({*}4.2.2{*}), we are encountering an issue with
the *Lazy implementation* based on {{ObjectSelect<T>.pageSize()}} when the
table’s *primary key* is of type {*}BIGINT{*}.
----
*Steps to Reproduce:*
# Use {{ObjectSelect<T>}} with pagination ({{{}pageSize{}}}) on a table where
the primary key column is of type {*}BIGINT{*}.
# Allow the {{IncrementalFaultList}} in *cayenne-server* to populate elements.
# Insert a new item into the dataset.
----
*Technical Details:*
* The issue occurs in {*}{{IncrementalFaultList.class}}{*}, specifically
within the {{fillIn}} method, which initializes {{{}protected final List
elements{}}}.
* When processing a *BIGINT* database PK mapping, the type defaults to
{*}{{Long}}{*}.
* This works fine until a new item is added. At that point, the method
{{updateWithResolvedObjectInRange}} is called, which in turn calls
{{replacesObject}} (for one of six implementations).
In our case, the class *{{SimpleIdIncrementalFaultList}}* is used.
Example:
* {{objectInTheList}} → value: {{{}137{}}}, type: *Long*
* {{idSnapshot.get(pk.getName())}} → value: {{{}137{}}}, type: *BigInteger*
*!image-2025-09-01-14-24-18-956.png!*
Because of the type mismatch, the comparison fails, leading to the following
exception:
!image-2025-09-01-14-24-41-442.png!
As a result, the list contains a *Long* object instead of the expected
*ObjEntity* inside our lazy implementation{*}.{*}
----
*Proposed Fix / Workaround:*
I modified the {{replacesObject}} method to handle *BigInteger* correctly.
!image-2025-09-01-14-26-02-296.png!
* *First modification (blue section in my test code):*
_Not recommended._ This forces replacement regardless of match. I added it only
to bypass an unrelated bug I observed occasionally. This may indicate a deeper
issue in the pagination implementation that requires further investigation.
* *Second modification (red section in my test code):*
_Required for correctness._ This ensures that *BigInteger* primary keys are
compared properly with Long values.
While this fix works, I believe a more elegant solution should exist within
Cayenne’s type handling logic.
----
*Test Configuration:*
* *Databases:*
** Oracle !image-2025-09-01-14-26-35-313.png!
** SQL Server !image-2025-09-01-14-26-45-722.png!
* *Entities:*
** {{{}DbEntity{}}}!image-2025-09-01-14-27-12-756.png!{{{}{}}}
** {{ObjEntity !image-2025-09-01-14-27-27-432.png!}}
----
*Impact:*
This is a {*}critical issue{*}: pagination becomes completely unusable when the
primary key is of type {*}BIGINT{*}.
----
*Best regards,*
Anton L.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)