[hibernate-dev] Some insight about HHH-12101 / remove HQL-style positional parameters
Laurent Almeras
lalmeras at gmail.com
Tue Feb 13 09:15:05 EST 2018
Thanks for your feedback.
As I currently use QueryDSL generated queries, it's not easy to switch
the way my queries are generated.
I post an issue with a github branch with some simple test-cases here:
https://hibernate.atlassian.net/browse/HHH-12290
Laurent Almeras
Le 07/02/2018 à 19:43, Steve Ebersole a écrit :
> And I did say that this is indeed a problem assuming you are right,
> and I have no reason to believe you are not. In fact I can see how
> that would happen. Yes all based on Hibernate internals.
>
> So I am not trying to blow you off as "this is not a bug". I think it
> is a bug. I'm just saying I do not yet know what to do about it.
>
> On Wed, Feb 7, 2018 at 12:41 PM Steve Ebersole <steve at hibernate.org
> <mailto:steve at hibernate.org>> wrote:
>
> Yes, I understood the situation.
>
> I'm saying that in your query you should just be able to switch to
> use named parameters (prefixed with `:`, rather than `?`) as a
> workaround
>
> On Wed, Feb 7, 2018 at 11:21 AM Laurent Almeras
> <laurent.almeras at laposte.net <mailto:laurent.almeras at laposte.net>>
> wrote:
>
> Hi,
>
> Thanks for this insight ; but as I stated (and this is a
> correction of the assumptions of my first email) in my second
> email, it seems that the wrong query (with mixed positional
> and named parameters) is built in hibernate inside layers (and
> not in QueryDSL).
>
> I get rid of my QueryDSL query and replace it with raw JPQL
> query :
>
>
> ============================
> Query query = getEntityManager().createQuery("select
> queuedTaskHolder\n" +
> "from QueuedTaskHolder queuedTaskHolder\n" +
> "where queuedTaskHolder.status in (?1) and
> queuedTaskHolder.queueId = ?2\n" +
> "order by queuedTaskHolder.id
> asc").setParameter(1, ImmutableList.of(TaskStatus.CANCELLED,
> TaskStatus.COMPLETED)).setParameter(2, "queue");
> return query.getResultList();
> ============================
>
> And it fails with the very same message :
>
>
> ============================
>
>
> Cannot define positional and named parameterSpecs : select
> queuedTaskHolder
> from
> org.iglooproject.jpa.more.business.task.model.QueuedTaskHolder
> queuedTaskHolder
>
> where queuedTaskHolder.status in (:x1_0, :x1_1) and
> queuedTaskHolder.queueId = ?2
> order by queuedTaskHolder.id asc
> at
> org.hibernate.hql.internal.ast.HqlSqlWalker.generatePositionalParameter(HqlSqlWalker.java:1094)
> at
> org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.parameter(HqlSqlBaseWalker.java:3463)
> ============================
>
> It used to work with Hibernate 5.2.x ; and by reading JPQL
> spec (not sure if this is the right version -
> https://docs.oracle.com/html/E13946_01/ejb3_langref.html#ejb3_langref_in
> ) it seems that " IN (?param) " is a valid syntax.
>
> I agree that mixed query may not be supported, but even if
> positional parameter queries bring nothing more than named
> parameters ones, there are also required for JPA compliance ?
>
> Can you say me if I made some wrong assumptions ? If not, is
> it usefull I provide some minimal test-case ?
>
>
>
> *Side-note:* same query written with named parameters is OK
> (as expected):
>
>
> ============================
> Query query = getEntityManager().createQuery("select
> queuedTaskHolder\n" +
> "from QueuedTaskHolder queuedTaskHolder\n" +
> "where queuedTaskHolder.status in (:statuses) and
> queuedTaskHolder.queueId = :queue\n" +
> "order by queuedTaskHolder.id
> asc").setParameter("statuses",
> ImmutableList.of(TaskStatus.CANCELLED,
> TaskStatus.COMPLETED)).setParameter("queue", "queue");
> return query.getResultList();
> ============================
>
>
>
> Thanks,
>
>
> Le 07/02/2018 à 17:30, Steve Ebersole a écrit :
>> Yes, I can see this being a problem. Its caused by some very
>> old, fulgy code in how "list-valued parameters" are handled
>> internally.
>>
>> I'm not sure the best way to deal with this. Unfortunately
>> reverting this is not possible - its necessary for JPA
>> compliance. The simple workaround of course is to use named
>> parameters yourself. Honestly JPA's notion of "positional"
>> parameters is nonsensical since they are not positional - the
>> ordinals can repeat and can appear in any order... nothing
>> particularly positional about that. In fact they are really
>> nothing more than named parameters that happen to use
>> int-valued labels.
>>
>> Longer term 6.0 will address this because it changes that
>> "old, fulgy" internal code - but those same changes are not
>> possibly in 5.3.
>>
>>
>
More information about the hibernate-dev
mailing list