/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ 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; } }