diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/onetoone/QueryOneToOneFKIsNullTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/onetoone/QueryOneToOneFKIsNullTest.java new file mode 100644 index 000000000000..0aa5d4ef4e66 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/onetoone/QueryOneToOneFKIsNullTest.java @@ -0,0 +1,103 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.query.onetoone; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Jpa(annotatedClasses = {QueryOneToOneFKIsNullTest.Parent.class, + QueryOneToOneFKIsNullTest.Child.class}) +@JiraKey("HHH-12712") +public class QueryOneToOneFKIsNullTest { + @Test + public void test(EntityManagerFactoryScope scope) { + scope.inTransaction(entityManager -> { + var parent1 = new Parent(1); + new Child(3, parent1); + entityManager.persist(parent1); + var parent2 = new Parent(2); + entityManager.persist(parent2); + }); + + scope.inTransaction(entityManager -> { + var query = entityManager.createQuery("from Parent p where p.child is null", Parent.class); + var parents = query.getResultList(); + assertEquals(1, parents.size()); + assertEquals(2L, parents.get(0).getId()); + }); + } + + @Entity(name = "Parent") + static class Parent { + @Id + private long id; + + @OneToOne(mappedBy = QueryOneToOneFKIsNullTest_.Child_.PARENT, + cascade = CascadeType.ALL) + private Child child; + + Parent() {} + + public Parent(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public Child getChild() { + return child; + } + + void setChild(Child child) { + this.child = child; + } + + @Override + public String toString() { + return "Parent [id=" + id + ", child=" + child + "]"; + } + } + + + @Entity(name = "Child") + static class Child { + @Id + private long id; + + @OneToOne + private Parent parent; + + Child() {} + + public Child(long id, Parent parent) { + this.id = id; + setParent(parent); + } + + public Parent getParent() { + return parent; + } + + public void setParent(Parent parent) { + this.parent = parent; + parent.setChild(this); + } + + @Override + public String toString() { + return "Child [id=" + id + "]"; + } + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/onetoone/QueryOneToOnePKIsNullTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/onetoone/QueryOneToOnePKIsNullTest.java new file mode 100644 index 000000000000..819e9c81b86c --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/onetoone/QueryOneToOnePKIsNullTest.java @@ -0,0 +1,99 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.query.onetoone; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Jpa(annotatedClasses = {QueryOneToOnePKIsNullTest.Parent.class, + QueryOneToOnePKIsNullTest.Child.class}) +@JiraKey("HHH-12712") +public class QueryOneToOnePKIsNullTest { + @Test + public void test(EntityManagerFactoryScope scope) { + scope.inTransaction(entityManager -> { + var parent1 = new Parent(1); + new Child(parent1); + entityManager.persist(parent1); + var parent2 = new Parent(2); + entityManager.persist(parent2); + }); + + scope.inTransaction(entityManager -> { + var query = entityManager.createQuery("from Parent p where p.child is null", Parent.class); + var parents = query.getResultList(); + assertEquals(1, parents.size()); + assertEquals(2L, parents.get(0).getId()); + }); + } + + @Entity(name = "Parent") + static class Parent { + @Id + private long id; + + @OneToOne(mappedBy = QueryOneToOnePKIsNullTest_.Child_.PARENT, + cascade = CascadeType.ALL) + private Child child; + + Parent() {} + + public Parent(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public Child getChild() { + return child; + } + + void setChild(Child child) { + this.child = child; + } + + @Override + public String toString() { + return "Parent [id=" + id + ", child=" + child + "]"; + } + } + + + @Entity(name = "Child") + static class Child { + @OneToOne @Id + private Parent parent; + + Child() {} + + public Child(Parent parent) { + setParent(parent); + } + + public Parent getParent() { + return parent; + } + + public void setParent(Parent parent) { + this.parent = parent; + parent.setChild(this); + } + + @Override + public String toString() { + return "Child [id=" + parent.getId() + "]"; + } + } +}