Hi (again), I've asked the same question on StackOverflow [1] and was pointed to a similar question [2] and actually found the well-hidden option to change this behavior by setting the hint UseLiteralInSql to true [3].
It seems to work, when I set this on the javax.persistence.Query, but it does not work, when I set the appropriate hint in orm.xml: <named-query name="person.v"> <query> select p from Person p where p.type = 'V' </query> <hint name="openjpa.hint.UseLiteralInSQL" value="true" /> </named-query> Something wrong with this, or is there a limitation I am running into? Thank you very much, Kariem [1] How can I prevent OpenJPA from replacing “constant” parameters in my queries? http://stackoverflow.com/questions/31516813 [2] jpa namedquery with literals changed to prepared statement http://stackoverflow.com/questions/28317482 [3] Javadoc org.apache.openjpa.kernel.QueryHints.HINT_USE_LITERAL_IN_SQL http://openjpa.apache.org/builds/2.4.0/apidocs/org/apache/openjpa/kernel/QueryHints.html#HINT_USE_LITERAL_IN_SQL On Thu, Jul 16, 2015 at 2:30 PM, Kariem Hussein <kariem.huss...@gmail.com> wrote: > Hi there, > > I am in the process of migrating a big (old) code base from JPA 1 with > Hibernate 3.3 to JPA 2 with OpenJPA. I've had a problem with a query that > used to work in the old version and now does not and I wanted to know > whether my reasoning is correct. > > I have already reduced the problem description to the minimal and I hope I > did not lose relevant pieces of information on the way. > > Given this table in Oracle > > create table PERSON ( > id char(10) not null, > type char(3) not null, > primary key (id) > ) > > There are a lot of rows with in total three different types "WTW", "WAI", > "V" (to be honest, I don't know what they stand for). However, we have an > entity to work with this table: > > @Entity > public class Person { > String id; > String type; > } > > The following query is used in the application from an orm.xml file: > > <named-query name="person.v"> > <query> > select p > from Person p > where p.type = 'V' > </query> > </named-query> > > As the `type` field is `char(3)`, Oracle will store `V ` ('V' followed > by two spaces) for the string "V". > > In Hibernate, I did not have a problem with this query, but with OpenJPA, > there is some magic performance improvement on this query that reduces the > number of queries by normalizing permutations -- at least that is what I > think why my query was translated this way -- which results in the > following SQL being sent to the DB > > select p.id, p.type > from PERSON p > where p.type = ? > > The "constant" parameter for `type` in my query was replaced with an SQL > parameter and the OpenJPA log shows that "V" is passed as value. I believe > that because of this replacement I do not get any results anymore. > > It works if I do one of the following > > - (a) Adapt the JPQL query to `where p.type = 'V '`, effectively knowing > about the underlying `char(3)` field. > - (b) Use a native query. OpenJPA will then not try to "improve" my query > in a way that changes its semantics. > > Is there something I can do to improve this behavior in JPA? Is there any > benefit in replacing a "constant" parameter in a named query that is only > used in this way (there are no permutations). > > Shouldn't the parameter be converted correctly (including padding) into > the DB type? Is this a bug, or do I have to specify some kind of hint? > > > Thank you for your comments, > Kariem > >