/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.openjpa.persistence.query; import javax.persistence.EntityManager; import javax.persistence.Query; import org.apache.openjpa.kernel.QueryLanguages; import org.apache.openjpa.kernel.jpql.JPQLParser; import org.apache.openjpa.persistence.OpenJPAPersistence; import org.apache.openjpa.persistence.test.SingleEMFTestCase; /** * This test was added for OPENJPA-1999. 'Add' support for allowing positional parameters to start at something other * than 1 and allow for missing parameters. */ public class TestQueryConvertPositionalParameters extends SingleEMFTestCase { EntityManager _em; long _id1; String _name1; String _val1; long _id2; String _name2; String _val2; @Override public void setUp() { super.setUp(SimpleEntity.class, "openjpa.Compatibility", "ConvertPositionalParametersToNamed=true" // ,"openjpa.Log","SQL=trace" ); _em = emf.createEntityManager(); _em.getTransaction().begin(); SimpleEntity se1 = new SimpleEntity(); _name1 = "name1"; _val1 = "val1"; se1.setName(_name1); se1.setValue(_val1); _em.persist(se1); _id1 = se1.getId(); _em.getTransaction().commit(); _em.getTransaction().begin(); SimpleEntity se2 = new SimpleEntity(); _name2 = "name2"; _val2 = "val2"; se2.setName(_name2); se2.setValue(_val2); _em.persist(se2); _id2 = se2.getId(); _em.getTransaction().commit(); _em.clear(); } @Override public void tearDown() throws Exception { if (_em.getTransaction().isActive()) { _em.getTransaction().rollback(); } _em.close(); super.tearDown(); } public void testNamedPositionalStartAtNonOne() { SimpleEntity se = _em.createNamedQuery("SelectWithPositionalParameterNonOneStart", SimpleEntity.class) .setParameter(900, _id1).setParameter(2, _name1).setParameter(54, _val1).getSingleResult(); assertNotNull(se); } public void testJPQLPositionalStartAtNonOne() { int idPos = 7; int namePos = 908; int valPos = 578; SimpleEntity se = _em.createQuery( "Select s FROM simple s where s.id=?" + idPos + " and s.name=?" + namePos + " and s.value=?" + valPos, SimpleEntity.class).setParameter(idPos, _id1).setParameter(namePos, _name1).setParameter(valPos, _val1) .getSingleResult(); assertNotNull(se); } public void testJPQLWithSubQueryPositionalStartAtNonOne() { int idPos = 7; int namePos = 908; int valPos = 578; SimpleEntity se = _em.createQuery( "Select s FROM simple s where s.id = ?" + idPos + " and (SELECT se.value FROM simple se where se.name=?" + namePos + ")=?" + valPos, SimpleEntity.class).setParameter(idPos, _id1).setParameter(namePos, _name1).setParameter(valPos, _val1) .getSingleResult(); assertNotNull(se); } public void testPreparedQueryPositionalStartAtNonOne() { int idPos = 54; int namePos = 23; int valPos = 42; String jpql = "Select s FROM simple s where s.id=?" + idPos + " and s.name=?" + namePos + " and s.value=?" + valPos; Query q = _em.createQuery(jpql).setParameter(idPos, _id1).setParameter(namePos, _name1).setParameter(valPos, _val1); SimpleEntity se = (SimpleEntity) q.getSingleResult(); assertNotNull(se); assertEquals(JPQLParser.LANG_JPQL, OpenJPAPersistence.cast(q).getLanguage()); Query q2 = _em.createQuery(jpql).setParameter(idPos, _id2).setParameter(namePos, _name2).setParameter(valPos, _val2); SimpleEntity se2 = (SimpleEntity) q2.getSingleResult(); assertNotNull(se2); assertEquals(QueryLanguages.LANG_PREPARED_SQL, OpenJPAPersistence.cast(q2).getLanguage()); } public void testPreparedQueryWithSubQueryPositionalStartAtNonOne() { int idPos = 7; int namePos = 908; int valPos = 352; String jpql = "Select s FROM simple s where s.id = ?" + idPos + " and (SELECT se.value FROM simple se where se.name=?" + namePos + ")=?" + valPos; Query q = _em.createQuery(jpql, SimpleEntity.class).setParameter(idPos, _id1).setParameter(namePos, _name1) .setParameter(valPos, _val1); SimpleEntity se = (SimpleEntity) q.getSingleResult(); assertNotNull(se); assertEquals(JPQLParser.LANG_JPQL, OpenJPAPersistence.cast(q).getLanguage()); Query q2 = _em.createQuery(jpql, SimpleEntity.class).setParameter(idPos, _id2).setParameter(namePos, _name2) .setParameter(valPos, _val2); SimpleEntity se2 = (SimpleEntity) q2.getSingleResult(); assertNotNull(se2); assertEquals(QueryLanguages.LANG_PREPARED_SQL, OpenJPAPersistence.cast(q2).getLanguage()); } }