Skip to content

Commit

Permalink
HHH-16967 Add test for issue
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed Dec 4, 2023
1 parent b1007cb commit 166f6e6
Showing 1 changed file with 213 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
package org.hibernate.orm.test.mapping.where;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.annotations.Where;

import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.Jira;
import org.hibernate.testing.orm.junit.Jpa;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Inheritance;
import jakarta.persistence.InheritanceType;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

@Jpa(
annotatedClasses = {
WhereAnnotationAndJoinedInheritanceTest.Parent.class,
WhereAnnotationAndJoinedInheritanceTest.Child.class,
WhereAnnotationAndJoinedInheritanceTest.PrimaryObject.class
}
)
@Jira("HHH-16967")
public class WhereAnnotationAndJoinedInheritanceTest {

private final static String PRIMARY_OBJECT_WITH_DELETED_CHILD = "with deleted child";
private final static String DELETED_CHILD = "deleted child";
private final static String NOT_DELETED_CHILD = "not deleted child";

@BeforeAll
public void setUp(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
Child child = new Child( 1l, NOT_DELETED_CHILD, null );
Child deletedChild = new Child( 2l, DELETED_CHILD, "deleted" );

PrimaryObject primaryObject = new PrimaryObject( 3l, child, "with not deleted child" );
PrimaryObject primaryObjectWithDeletedChild = new PrimaryObject(
4l,
deletedChild,
PRIMARY_OBJECT_WITH_DELETED_CHILD
);
entityManager.persist( child );
entityManager.persist( deletedChild );
entityManager.persist( primaryObject );
entityManager.persist( primaryObjectWithDeletedChild );
}
);
}

@Test
public void testCriteriaQuery(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<PrimaryObject> query = builder.createQuery( PrimaryObject.class );
Root<PrimaryObject> root = query.from( PrimaryObject.class );

query.where(
builder.equal(
root.get( "child" ).get( "primaryObjects" ).get( "data" ),
PRIMARY_OBJECT_WITH_DELETED_CHILD
) );

// the child
List<PrimaryObject> resultList = entityManager.createQuery( query ).getResultList();
assertThat( resultList.size() ).isEqualTo( 0 );
}
);
}

@Test
public void testCriteriaQueryWithoutWhereClause(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<PrimaryObject> query = builder.createQuery( PrimaryObject.class );
Root<PrimaryObject> root = query.from( PrimaryObject.class );

// the child
List<PrimaryObject> resultList = entityManager.createQuery( query ).getResultList();
assertThat( resultList.size() ).isEqualTo( 2 );

resultList.forEach(
primaryObject -> {
Child child = primaryObject.getChild();
if ( primaryObject.getData().equals( PRIMARY_OBJECT_WITH_DELETED_CHILD ) ) {
assertThat( child ).isNull();
}
else {
assertThat( child ).isNotNull();
}
}
);
}
);
}

@Test
public void testCriteriaQuery2(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<PrimaryObject> query = builder.createQuery( PrimaryObject.class );
Root<PrimaryObject> root = query.from( PrimaryObject.class );

query.where(
builder.equal(
root.get( "child" ).get( "data" ), DELETED_CHILD ) );

List<PrimaryObject> resultList = entityManager.createQuery( query ).getResultList();
assertThat( resultList.size() ).isEqualTo( 0 );

builder = entityManager.getCriteriaBuilder();
query = builder.createQuery( PrimaryObject.class );
root = query.from( PrimaryObject.class );

query.where(
builder.equal(
root.get( "child" ).get( "data" ), NOT_DELETED_CHILD ) );

resultList = entityManager.createQuery( query ).getResultList();
assertThat( resultList.size() ).isEqualTo( 1 );
}
);
}


@Entity(name = "Parent")
@Inheritance(strategy = InheritanceType.JOINED)
@Where(clause = "deleted_column is null")
public static abstract class Parent {

@Id
private Long id;

private String data;

@Column(name = "deleted_column")
private String deleted;

public Parent() {
}

public Parent(Long id, String data, String deleted) {
this.id = id;
this.data = data;
this.deleted = deleted;
}
}

@Entity(name = "Child")
public static class Child extends Parent {

@Column(name = "child_data")
private String childData;

@OneToMany(mappedBy = "child")
private List<PrimaryObject> primaryObjects = new ArrayList<>();

public Child() {
}

public Child(Long id, String data, String deleted) {
super( id, data, deleted );
}
}

@Entity(name = "PrimaryObject")
public static class PrimaryObject {

@Id
private Long id;

@ManyToOne
private Child child;

private String data;

public PrimaryObject() {
}

public PrimaryObject(Long id, Child child, String data) {
this.id = id;
this.child = child;
this.data = data;
}

public Long getId() {
return id;
}

public Child getChild() {
return child;
}

public String getData() {
return data;
}
}

}

0 comments on commit 166f6e6

Please sign in to comment.