/*
* 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.sqlresultmapping;
import java.sql.Timestamp;
import java.util.List;
import java.util.Properties;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.apache.openjpa.persistence.querycache.QCEntity;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/*
* Test for OPENJPA-2651.
*/
public class TestSQLResultSetMapping extends SingleEMFTestCase {
public void setUp() {
super.setUp(DROP_TABLES, CrtOperacaoEntity.class,
CrtRequisicaoEntity.class, CrtRequisicaoChequePersEntity.class);
// Set up necessary test data:
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
CrtOperacaoEntity op = new CrtOperacaoEntity();
op.setId(25384);
op.setDataHora(Timestamp.valueOf("2014-12-16 15:24:54.0"));
em.persist(op);
CrtOperacaoEntity op2 = new CrtOperacaoEntity();
op2.setId(23409);
op2.setDataHora(Timestamp.valueOf("2014-10-27 16:12:53.0"));
em.persist(op2);
CrtRequisicaoChequePersEntity reqCheq =
new CrtRequisicaoChequePersEntity();
reqCheq.setId(500006164);
reqCheq.setCrtOperacaoByOperacaoRecepcaoServCent(op);
reqCheq.setCrtOperacaoByOperacaoRequisicao(op2);
em.persist(reqCheq);
em.getTransaction().commit();
em.close();
}
/*
* Prior to OPENJPA-2651, this test would result in the following exception:
*
* PersistenceException: Column '0' not found.
* FailedObject:
* org.apache.openjpa.persistence.query.sqlresultmapping.CrtOperacaoEntity-500006164 [java.lang.String]
* at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4998)
* .....
* Caused by: java.sql.SQLException: Column '0' not found.
*/
public void testMappingNoException() {
String sql = "SELECT t0.ID, t2.DATA_HORA as opRecepcaoServCentraisDataHora, t2.ID as opRecepcaoServCentraisId"
+ " FROM CRT_REQUISICAO_CHEQUE_PERS t0, CRT_OPERACAO t2 WHERE t0.ID = 500006164 and t2.ID = 25384";
EntityManager em = emf.createEntityManager();
Query query = em.createNativeQuery(sql, "MyResultMapping");
List<CrtRequisicaoChequePersEntity> res = query.getResultList();
assertEquals(res.size(), 1);
assertEquals(500006164, res.get(0).getId());
assertEquals(25384, res.get(0).getCrtOperacaoByOperacaoRecepcaoServCent().getId());
assertEquals(Timestamp.valueOf("2014-12-16 15:24:54.0"),
res.get(0).getCrtOperacaoByOperacaoRecepcaoServCent().getDataHora());
em.close();
}
/*
* Prior to OPENJPA-2651, this test would result in the wrong id provided in the
* CrtOperacaoEntity. Specifically, the ID in CrtOperacaoEntity would contain
* '500006164', which is the ID for the CrtRequisicaoEntity.
*/
public void testMappingCorrectID() {
String sql =
"SELECT t0.ID, t1.ID as opRecepcaoServCentraisId, t1.DATA_HORA as opRecepcaoServCentraisDataHora, "
+ "t2.ID, t2.DATA_HORA, t3.ID, t4.ID, t4.OPERACAO_RECEPCAO_SERV_CENT, "
+ "t4.OPERACAO_REQUISICAO FROM CRT_REQUISICAO_CHEQUE_PERS t0 LEFT OUTER JOIN "
+ "CRT_OPERACAO t1 ON t0.OPERACAO_RECEPCAO_SERV_CENT = t1.ID LEFT OUTER JOIN "
+ "CRT_OPERACAO t2 ON t0.OPERACAO_REQUISICAO = t2.ID "
+ "LEFT OUTER JOIN CRT_REQUISICAO t3 "
+ "ON t0.ID = t3.ID INNER JOIN CRT_REQUISICAO t5 "
+ "ON t0.ID = t5.ID LEFT OUTER JOIN "
+ "CRT_REQUISICAO_CHEQUE_PERS t4 "
+ "ON t3.ID = t4.ID WHERE t0.ID = 500006164";
EntityManager em = emf.createEntityManager();
Query query = em.createNativeQuery(sql, "MyResultMapping");
List<CrtRequisicaoChequePersEntity> res = query.getResultList();
assertEquals(res.size(), 1);
assertEquals(500006164, res.get(0).getId());
assertEquals(25384, res.get(0).getCrtOperacaoByOperacaoRecepcaoServCent().getId());
assertEquals(Timestamp.valueOf("2014-12-16 15:24:54.0"),
res.get(0).getCrtOperacaoByOperacaoRecepcaoServCent().getDataHora());
em.close();
}
}