openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Albert Lee (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-1381) IllegalStateException on query method call after named query is created twice.
Date Wed, 11 Nov 2009 16:01:39 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-1381?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12776486#action_12776486
] 

Albert Lee commented on OPENJPA-1381:
-------------------------------------

The problem is in PreparedQueryImpl, in which getLanauge() always return QueryLanguages.LANG_PREPARED_SQL
regardless of the source of the cached Query. It is not sensitive to the query source.

In EntityManagerImpl.createNamedQuery:

    public OpenJPAQuery createNamedQuery(String name) {
        try {
            ....
            PreparedQuery pq = JPQLParser.LANG_JPQL.equals(meta.getLanguage())
                ? getPreparedQuery(qid) : null;
            org.apache.openjpa.kernel.Query del = (pq == null)
                ? _broker.newQuery(meta.getLanguage(), meta.getQueryString())
                : _broker.newQuery(pq.getLanguage(), pq);
            
The first time the named query is created, there is no query cached, a new Query is created
using the metadata's language attribute (i.e. JPQL). The second time the named query is created,
it is found in query cache, and the preparedQuery's language is used, which is ALWAYS SQL,
that caused the ISEx when tested in the setLockMode() call path.



> IllegalStateException on query method call after named query is created twice.
> ------------------------------------------------------------------------------
>
>                 Key: OPENJPA-1381
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1381
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.0.0
>            Reporter: Albert Lee
>            Assignee: Albert Lee
>             Fix For: 2.0.0
>
>
> When a query method is called (e.g. setLockMode) on a named query that has been created
twice, an IllegalStateException is thrown:
>   Query q1 = em.createNamedQuery("xxxx");
>   ,,,,
>   Query q2 = em.createNamedQuery("xxxx");
>   q2.setLockMode(READ);
> 11078  test  TRACE  [Thread-4] Tests - Caught exception and continue: java.lang.IllegalStateException:
Query is neither a JPQL SELECT nor a Criteria API query.
> 11078  test  TRACE  [Thread-4] DumpStack - java.lang.IllegalStateException: Query is
neither a JPQL SELECT nor a Criteria API query.
> 	at org.apache.openjpa.persistence.QueryImpl.assertJPQLOrCriteriaQuery(QueryImpl.java:377)
> 	at org.apache.openjpa.persistence.QueryImpl.setLockMode(QueryImpl.java:396)
> 	at org.apache.openjpa.persistence.QueryImpl.setLockMode(QueryImpl.java:1)
> 	at org.apache.openjpa.persistence.lockmgr.SequencedActionsTest.launchCommonSequence(SequencedActionsTest.java:409)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message