[ https://issues.apache.org/jira/browse/OPENJPA-2534?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14272693#comment-14272693 ]
Mark Struberg commented on OPENJPA-2534: ---------------------------------------- Another small note: In Oracle it's even not that easy to see that you got hit by that. Usually Oracle parses the (int) 1 in the query and converts it automatically to the target column type. There are of course 2 very nasty issues with this: 1.) It gets much slower. Despite having an Index correctly set up it will simply not be used. Because of the required toNumber(). Most times you don't even see this in the explain. 2.) Some queries even blow up completely. Somehow Oracle manages the coercion halfway decent with normal queries - but if you use case statements it simply blows up complaining about a parameter mismatch. > A boolean is not converted correct when using the hint 'UseLiteralInSQL'. > ------------------------------------------------------------------------- > > Key: OPENJPA-2534 > URL: https://issues.apache.org/jira/browse/OPENJPA-2534 > Project: OpenJPA > Issue Type: Bug > Components: sql > Affects Versions: 2.1.2, 2.2.1.1, 2.2.3, 2.3.1, 2.4.0 > Reporter: Heath Thomann > Assignee: Rick Curtis > Priority: Critical > Attachments: OPENJPA-2534.patch > > > The hint, 'openjpa.hint.UseLiteralInSQL', is not properly converting a > boolean to an int. To illustrate this, lets take this entity: > public class MyEntity implements Serializable { > @Id > private Integer pk; > private boolean flag; > .......... > With this entity, lets take this test: > Query q = em.createQuery("SELECT f FROM MyEntity f WHERE f.flag = true"); > q.setHint("openjpa.hint.UseLiteralInSQL", "false"); //false is the default > q.getResultList(); > With this code, the following SQL will be generated: > SELECT t0.pk, t0.code, t0.code2, t0.flag FROM MyEntity t0 WHERE (t0.flag = ?) > [params=(int) 1] > Next, lets take this code: > Query q = em.createQuery("SELECT f FROM MyEntity f WHERE f.flag = true"); > q.setHint("openjpa.hint.UseLiteralInSQL", "true"); > q.getResultList(); > With this code, the following SQL will be generated: > SELECT t0.pk, t0.code, t0.code2, t0.flag FROM MyEntity t0 WHERE (t0.flag = > true) > However, in the latter case where UseLiteralInSQL=true, the following SQL > should be generated: > SELECT t0.pk, t0.code, t0.code2, t0.flag FROM MyEntity t0 WHERE (t0.flag = > '1') > Thanks, > Heath -- This message was sent by Atlassian JIRA (v6.3.4#6332)