/** * Create restrictions on an id of a related entity. * * @param propertyName Name of the property, which is the relation. */ public static AuditRelatedId relatedId(String propertyName) { return relatedId( null, propertyName ); }
@Override protected Object queryForReferencedEntity( AuditReaderImplementor versionsReader, EntityInfo referencedEntity, Serializable primaryKey, Number revision) { return versionsReader.createQuery().forEntitiesAtRevision( referencedEntity.getEntityClass(), referencedEntity.getEntityName(), revision ) .add( AuditEntity.relatedId( owningReferencePropertyName ).eq( primaryKey ) ) .getSingleResult(); } }
@Test public void testCompany1EmployeeIn() { AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity( Employee.class, true, true ); auditQuery.add( AuditEntity.relatedId( "company" ).in( new Integer[]{ company1Id } ) ); final List<Employee> results = auditQuery.getResultList(); assertEquals( 2, results.size() ); final Employee employee1 = makeEmployee( employee1Id, "Employee1", company1Id, "COMPANY1" ); final Employee employee2 = makeEmployee( employee2Id, "Employee2", company1Id, "COMPANY1" ); assertThat( results.contains( employee1 ), is(true) ); assertThat( results.contains( employee2 ), is(true) ); }
@Test public void testCompany2EmployeeIn() { AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity( Employee.class, true, true ); auditQuery.add( AuditEntity.relatedId( "company" ).in( new Integer[]{ company2Id } ) ); final List<Employee> results = auditQuery.getResultList(); assertEquals( 2, results.size() ); final Employee employee1 = makeEmployee( employee2Id, "Employee2", company2Id, "COMPANY2" ); final Employee employee2 = makeEmployee( employee3Id, "Employee3", company2Id, "COMPANY2" ); assertThat( results.contains( employee1 ), is(true) ); assertThat( results.contains( employee2 ), is(true) ); }
@Test public void testEntitiesReferencedToId4() { Set rev1_related = new HashSet( getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id4 ) ) .getResultList() ); Set rev2_related = new HashSet( getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id4 ) ) .getResultList() ); Set rev3_related = new HashSet( getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id4 ) ) .getResultList() ); assert rev1_related.equals( TestTools.makeSet() ); assert rev2_related.equals( TestTools.makeSet( new SetRefIngEmbIdEntity( id2, "y", null ) ) ); assert rev3_related.equals( TestTools.makeSet() ); }
@Test public void shouldFailWhenQueryOnManyToOne() { //when PlainEntity plainEntity = (PlainEntity) getAuditReader().createQuery() .forEntitiesAtRevision( PlainEntity.class, 1 ) .add( AuditEntity.relatedId( "component_manyToOneEntity" ).eq( getManyToOneEntity().getId() ) ) .getResultList().get( 0 ); //then Assert.assertEquals( getManyToOneEntity(), plainEntity.getComponent().getManyToOneEntity() ); }
@Test public void testCompany3EmployeeIn() { AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity( Employee.class, true, true ); auditQuery.add( AuditEntity.relatedId( "company" ).in( new Integer[]{ company3Id } ) ); final List<Employee> results = auditQuery.getResultList(); assertEquals( 1, results.size() ); final Employee employee = makeEmployee( employee4Id, "Employee4", company3Id, "COMPANY3" ); assertEquals( results, TestTools.makeList( employee ) ); }
@Test public void testEntitiesReferencedToId4() { Set rev1_related = new HashSet( getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id4 ) ) .getResultList() ); Set rev2_related = new HashSet( getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id4 ) ) .getResultList() ); Set rev3_related = new HashSet( getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id4 ) ) .getResultList() ); assertEquals( rev1_related, TestTools.makeSet() ); assertEquals( rev2_related, TestTools.makeSet( new SetRefIngMulIdEntity( id2, "y", null ) ) ); assertEquals( rev3_related, TestTools.makeSet() ); }
@Test public void testEntitiesReferencedByIng1ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id1 ) ) .getResultList(); Object rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); assert rev1_related.size() == 0; assert rev2_related.equals( new SetRefIngEmbIdEntity( id1, "x", null ) ); assert rev3_related.equals( new SetRefIngEmbIdEntity( id1, "x", null ) ); }
@Test public void testEntitiesReferencedByIng2ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id2 ) ) .getResultList(); List rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id2 ) ) .getResultList(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id2 ) ) .getSingleResult(); assert rev1_related.size() == 0; assert rev2_related.size() == 0; assert rev3_related.equals( new SetRefIngEmbIdEntity( id2, "y", null ) ); } }
@Test public void testLeftJoinOnAuditedEntity() { final AuditReader auditReader = getAuditReader(); // all cars where the owner has an age of 20 or where there is no owner at all List<Car> resultList = auditReader.createQuery() .forEntitiesAtRevision( Car.class, 1 ) .traverseRelation( "owner", JoinType.LEFT, "p" ) .up().add( AuditEntity.or( AuditEntity.property( "p", "age").eq( 20 ), AuditEntity.relatedId( "owner" ).eq( null ) ) ) .addOrder( AuditEntity.property( "make" ).asc() ).getResultList(); assertEquals( "The result list should have 2 results, car1 because its owner has an age of 30 and car3 because it has no owner at all", 2, resultList.size() ); Car car0 = resultList.get(0); Car car1 = resultList.get(1); assertEquals( "Unexpected car at index 0", car2.getId(), car0.getId() ); assertEquals( "Unexpected car at index 0", car3.getId(), car1.getId() ); }
@Test public void testEntitiesReferencedByIng2ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id2 ) ) .getResultList(); List rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id2 ) ) .getResultList(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id2 ) ) .getSingleResult(); assertEquals( 0, rev1_related.size() ); assertEquals( 0, rev2_related.size() ); assertEquals( new SetRefIngMulIdEntity( id2, "y", null ), rev3_related ); } }
getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .getResultList() ); getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .getResultList() ); getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngEmbIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .getResultList() );
@Test public void testEntitiesReferencedByIng1ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id1 ) ) .getResultList(); Object rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); assertEquals( 0, rev1_related.size() ); assertEquals( rev2_related, new SetRefIngMulIdEntity( id1, "x", null ) ); assertEquals( rev3_related, new SetRefIngMulIdEntity( id1, "x", null ) ); }
@Test public void shouldFailWhenQueryOnOneToOne() { //when try { getAuditReader().createQuery() .forEntitiesAtRevision( PlainEntity.class, 1 ) .add( AuditEntity.relatedId( "component_oneToOneEntity" ).eq( getOneToOneEntity().getId() ) ) .getResultList(); //then fail( "This should have generated an IllegalArgumentException" ); } catch ( Exception e ) { assertTyping( IllegalArgumentException.class, e ); } } }
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true ) .add( AuditEntity.relatedId( "person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 1 ) ) .getResultList(); .add( AuditEntity.relatedId( "person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 2 ) ) .getResultList(); .add( AuditEntity.relatedId( "person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 3 ) ) .getResultList(); .add( AuditEntity.relatedId( "document" ).eq( 1 ) ) .getResultList(); assertEquals( 2, results.size() ); .add( AuditEntity.relatedId( "document" ).eq( 2 ) ) .getResultList(); assertEquals( 1, results.size() );
.forEntitiesAtRevision( AdvancedEntity.class, 1 ) .add( AuditEntity.relatedId( "dynamicConfiguration_" + PROP_MANY_TO_ONE ) .eq( manyToOneEntity.getId() )
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true ) .add( AuditEntity.relatedId( "person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 1 ) ) .getResultList(); .add( AuditEntity.relatedId( "person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 2 ) ) .getResultList(); .add( AuditEntity.relatedId( "person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 3 ) ) .getResultList(); .add( AuditEntity.relatedId( "document" ).eq( 1 ) ) .getResultList(); assertEquals( 2, results.size() ); .add( AuditEntity.relatedId( "document" ).eq( 2 ) ) .getResultList(); assertEquals( 1, results.size() );
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true ) .add( AuditEntity.relatedId( "id.person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 1 ) ) .getResultList(); .add( AuditEntity.relatedId( "id.person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 2 ) ) .getResultList(); .add( AuditEntity.relatedId( "id.person" ).eq( 1 ) ) .add( AuditEntity.revisionNumber().eq( 3 ) ) .getResultList(); .add( AuditEntity.relatedId( "id.document" ).eq( 1 ) ) .getResultList(); assertEquals( 2, results.size() ); .add( AuditEntity.relatedId( "id.document" ).eq( 2 ) ) .getResultList(); assertEquals( 1, results.size() );
getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 1 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .getResultList() ); getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 2 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .getResultList() ); getAuditReader().createQuery() .forEntitiesAtRevision( SetRefIngMulIdEntity.class, 3 ) .add( AuditEntity.relatedId( "reference" ).eq( id3 ) ) .getResultList() );