users@jpa-spec.java.net

[jpa-spec users] [jsr338-experts] Ambiguities in exceptions for EntityManager.createQuery(…)

From: Oliver Gierke <ogierke_at_vmware.com>
Date: Tue, 17 Jul 2012 02:05:16 -0700

Hi all,

there are multiple (contradicting) sections in the spec defining the error cases of EntityManager.createQuery(…). The JavaDoc in 3.1.1 states:

> /**
> * …
> * @throws IllegalArgumentException if the query string is
> * found to be invalid
> */
> public Query createQuery(String qlString);

Below the code sample we find the following section:

> If the argument to the createQuery method is not a valid Java Persistence query string or a valid CriteriaQuery object, the IllegalArgumentException may be thrown or the query execution will fail and a PersistenceException will be thrown.

What does "may be thrown" exactly mean? Why is query execution discussed in this context? Does that mean that createQuery(…) might return a Query object that will only fail eventually when being executed? If so, why is this allowed actually? If so how can one reliably check a query string for syntactical correctness?

I currently have code that tries to validate a query string by calling em.createQuery(…) and catching IllegalArgumentException as defined in the JavaDoc. Unfortunately I've just discovered Hibernate (3.x and 4.x) throwing IllegalStateException in case the query tree seems valid in general but fails being parsed later on.

em.createQuery("somethingAbsurd") -> IllegalArgumentException
em.createQuery("select disinct(u) from User u") -> IllegalStateException

I'd like to get a clear picture on what is actually required before filing a ticket against Hibernate. Is it worth to straighten that out in the upcoming version of the spec?

Cheers,
Ollie

-- 
/**
 * @author Oliver Gierke - Senior Member Technical Staff
 *
 * @param email ogierke_at_vmware.com
 * @param phone +49-351-30929001
 * @param fax   +49-351-418898439
 * @param skype einsdreizehn
 * @see http://www.olivergierke.de
 */