private static void runDemo( EntityManager em ) throws Exception
{
em.getTransaction().begin();
TestEntity e;
long start = System.currentTimeMillis();
for( int i=0; i<10; i++ )
{
e = new TestEntity();
e.customValues = new ArrayList<TestKeyValueEntity>();
TestEntityExtensionA meA = new TestEntityExtensionA();
meA.setParent( e );
meA.customValueA = "extA_"+i;
e.setExtension( meA );
if( i % 2 == 0 )
{
TestEntityExtensionB meB = new TestEntityExtensionB();
meB.customValueB = "extB_"+i;
meB.setParent( e );
e.setExtension( meB );
}
em.persist( e );
}
em.getTransaction().commit();
System.out.println( "\n\nCreation Time: " + ( System.currentTimeMillis() - start ) + "ms" );
em.clear();
em.getEntityManagerFactory().getCache().evictAll();
start = System.currentTimeMillis();
List<Tuple> result;
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Tuple> cq = cb.createTupleQuery();
final Root<TestEntity> root = cq.from( TestEntity.class );
final List<Selection<?>> selections = new LinkedList<Selection<?>>();
selections.add( root.get( "id" ) );
final ListJoin< TestEntity, TestEntityExtension > baseJoinExtA = root.<TestEntity, TestEntityExtension>joinList( "extensions", JoinType.LEFT );
baseJoinExtA.on( cb.equal( baseJoinExtA.get( "extensionType" ), TestEntityExtensionA.class.getName() ) );
final ListJoin<TestEntity, TestEntityExtensionA> joinExtA = cb.treat(
baseJoinExtA,
TestEntityExtensionA.class
);
selections.add( joinExtA.get( "id" ) );
selections.add( joinExtA.get( "customValueA" ) );
final ListJoin< TestEntity, TestEntityExtension > baseJoinExtB = root.<TestEntity, TestEntityExtension>joinList( "extensions", JoinType.LEFT );
baseJoinExtB.on( cb.equal( baseJoinExtB.get( "extensionType" ), TestEntityExtensionB.class.getName() ) );
final ListJoin<TestEntity, TestEntityExtensionB> joinExtB = cb.treat(
baseJoinExtB,
TestEntityExtensionB.class
);
selections.add( joinExtB.get( "id" ) );
selections.add( joinExtB.get( "customValueB" ) );
cq.multiselect( selections );
result = em.createQuery( cq ).getResultList();
System.out.println( "\n\nFetch Time: " + ( System.currentTimeMillis() - start ) + "ms" );
for( Tuple r : result )
System.out.println( Arrays.toString( r.toArray() ) );
em.close();
}