I have an entity CommandJdo that has a property called "timestamp", of type java.sql.Timestamp
My JDOQL for this is:
WHERE executeIn == 'FOREGROUND'
&& timestamp > :timestamp
&& startedAt != null
&& completedAt != null
ORDER BY timestamp ASC
Running against SQL Server 2016 this gave me a different result first time it was run compared to subsequent times.
Running SQL Profiler I found the underlying SQL as:
exec sp_prepexec @p1 output,N'@P0 datetime2',N'SELECT ''org.isisaddons.module.command.dom.CommandJdo'' AS NUCLEUS_TYPE,A0.arguments,A0.completedAt,A0."exception",A0.executeIn,A0.memberIdentifier,A0.memento,A0.replayState,A0.replayStateFailureReason,A0."result",A0.startedAt,A0.targetAction,A0.targetClass,A0.target,A0."timestamp",A0.transactionId,A0."user",''2018-01-24 17:29:18.3'' AS NUCORDER0 FROM isiscommand.Command A0 WHERE A0.executeIn = ''FOREGROUND'' AND A0."timestamp" > @P0 AND A0.startedAt IS NOT NULL AND A0.completedAt IS NOT NULL ORDER BY NUCORDER0 OFFSET 0 ROWS FETCH NEXT 2 ROWS ONLY ','2018-01-24 17:29:18.3000000'
To unpick this, the key bit is: '
'2018-01-24 17:29:18.3'' AS NUCORDER0
... ORDER BY NUCORDER0
So in the JDOQL the "ORDER BY timestamp ASC", the "timestamp" is being evaluated as the current time, I suppose as a sort-of built-in function.
Which was surprising.
My fix was to change the JDOQL to be:
ORDER BY this.timestamp ASC