You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Francesco Chicchiriccò (JIRA)" <ji...@apache.org> on 2017/05/03 06:46:04 UTC

[jira] [Work started] (OPENJPA-2698) Query cache incorrectly handles parameters for BETWEEN expressions

     [ https://issues.apache.org/jira/browse/OPENJPA-2698?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Work on OPENJPA-2698 started by Francesco Chicchiriccò.
-------------------------------------------------------
> Query cache incorrectly handles parameters for BETWEEN expressions
> ------------------------------------------------------------------
>
>                 Key: OPENJPA-2698
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2698
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jdbc, jpa, sql
>    Affects Versions: 2.2.2
>            Reporter: Will Dazey
>            Assignee: Francesco Chicchiriccò
>            Priority: Minor
>             Fix For: 2.4.3, 3.0.0
>
>         Attachments: OPENJPA-2698-2.2.x.patch
>
>
> When query cache is enabled: 
> <property name="openjpa.jdbc.QuerySQLCache" value="true"/>
> If a query containing a BETWEEN expression is executed multiple times with different parameter values, the parameter values can persist across queries.
> Example:
> //Query1
> String jpql2 = "SELECT e FROM Employee e WHERE :baseDate between e.startDate AND e.endDate";
> TypedQuery<Employee> q1 = em.createQuery(jpql2, Employee.class);
> q1.setParameter("baseDate", new GregorianCalendar(2016, Calendar.JUNE, 1).getTime());
> q1.getResultList();
> //Query2
> TypedQuery<Employee> q2 = em.createQuery(jpql2, Employee.class);
> q2.setParameter("baseDate", new GregorianCalendar(2017, Calendar.JUNE, 1).getTime());
> q2.getResultList();
> Produces the following queries:
> Q1:
> SELECT t0.id, t0.endDate, t0.hireStatus, t0.isManager, t0.name, t0.startDate, t0.status 
>     FROM EMPLOYEE_PQC t0  
>     WHERE (? >= t0.startDate AND ? <= t0.endDate) 
> [params=(Timestamp) 2016-06-01 00:00:00.0, (Timestamp) 2016-06-01 00:00:00.0]
> Q2:
> SELECT t0.id, t0.endDate, t0.hireStatus, t0.isManager, t0.name, t0.startDate, t0.status 
>     FROM EMPLOYEE_PQC t0
>     WHERE (? >= t0.startDate AND ? <= t0.endDate) 
> [params=(Timestamp) 2017-06-01 00:00:00.0, (Timestamp) 2016-06-01 00:00:00.0]
> As you can see, the cached parameter for the endDate has persisted from the first query's parameters.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)