/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Middleware LLC. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.envers.test.various; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.hibernate.Session; /** * @author Adam Warski (adam at warski dot org) */ public class HsqlTest { /* Query generated by Hibernate from an old demo, when criteria was used: (works) select this_.id as id2_0_, this_._revision as column2_2_0_, this_._revision_type as column3_2_0_, this_.name as name2_0_, this_.surname as surname2_0_, this_.address_id as address6_2_0_ from Person_versions this_ where this_._revision = ( select max(e2_._revision) as y0_ from Person_versions e2_ where e2_._revision<=1 and this_.id=e2_.id ) and this_.id=1 Query generated by Hibernate from a new demo, when query generator is used: (throws Column not found: ID in statement because of "person_ver0_.id=person_ver1_.id") select person_ver0_.id as id3_, person_ver0_._revision as column2_3_, person_ver0_._revision_type as column3_3_, person_ver0_.name as name3_, person_ver0_.surname as surname3_, person_ver0_.address_id as address6_3_ from Person_versions person_ver0_ where person_ver0_._revision_type<>2 and person_ver0_._revision=( select max(person_ver1_._revision) from Person_versions person_ver1_ where person_ver1_._revision<=1 and person_ver0_.id=person_ver1_.id ) and person_ver0_.id=1 Both queries work from HSQL console (to run: java -cp hsqldb.jar org.hsqldb.util.DatabaseManager -user sa -url jdbc:hsqldb:file:/tmp/_versions_demo.db) TODO: post hibernate bug */ public static void main(String[] argv) { Map<String, String> configurationOverrides = new HashMap<String, String>(); EntityManagerFactory emf = Persistence.createEntityManagerFactory("ConsolePU", configurationOverrides); EntityManager entityManager = emf.createEntityManager(); populateTestData(entityManager); entityManager.getTransaction().begin(); Session sesion = (Session) entityManager.getDelegate(); System.out.println(sesion.createQuery( "select e from org.hibernate.envers.demo.Person_versions e " + "where " + "e.originalId._revision.id =" + "(select max(e2.originalId._revision.id) " + "from org.hibernate.envers.demo.Person_versions e2 " + "where e.originalId.id = :p0) ") .setParameter("p0", 1) .list()); entityManager.getTransaction().commit(); entityManager.close(); emf.close(); } private static void populateTestData(EntityManager entityManager) { entityManager.getTransaction().begin(); if (!hasData(entityManager)) { Person p1 = new Person(); Address a1 = new Address(); p1.setName("James"); p1.setSurname("Bond"); p1.setAddress(a1); a1.setStreetName("MI6"); a1.setHouseNumber(18); a1.setFlatNumber(25); a1.setPersons(new HashSet<Person>()); a1.getPersons().add(p1); entityManager.persist(a1); entityManager.persist(p1); System.out.println("The DB was populated with example data."); } entityManager.getTransaction().commit(); } private static boolean hasData(EntityManager entityManager) { return (((Long) entityManager.createQuery("select count(a) from Address a").getSingleResult()) + ((Long) entityManager.createQuery("select count(p) from Person p").getSingleResult())) > 0; } }