add a test for implicit collection joins in 'select' clause
This commit is contained in:
parent
2bd427befe
commit
4da2fe0f5b
|
@ -0,0 +1,165 @@
|
|||
package org.hibernate.orm.test.query.hql.instantiation;
|
||||
|
||||
import jakarta.persistence.CascadeType;
|
||||
import jakarta.persistence.ElementCollection;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.OneToMany;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
@SessionFactory
|
||||
@DomainModel(annotatedClasses = {InstantiationWithCollectionTest.Entity.class,
|
||||
InstantiationWithCollectionTest.ChildEntity.class})
|
||||
public class InstantiationWithCollectionTest {
|
||||
|
||||
@Test
|
||||
void testElements(SessionFactoryScope scope) {
|
||||
scope.getSessionFactory().getSchemaManager().truncateMappedObjects();
|
||||
|
||||
Entity entity = new Entity("hello", "world");
|
||||
scope.inTransaction(s -> s.persist(entity));
|
||||
|
||||
List<Object[]> tuples =
|
||||
// this kind of query is currently not documented to work, but it does, and I guess I don't see why it's terrible
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, names from Entity", Object[].class).getResultList());
|
||||
assertEquals(2, tuples.size());
|
||||
tuples.forEach(tuple -> assertNotNull(tuple[0]));
|
||||
tuples.forEach(tuple -> assertNotNull(tuple[1]));
|
||||
|
||||
List<Object[]> tuples2 =
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, element(names) from Entity", Object[].class).getResultList());
|
||||
assertEquals(2, tuples2.size());
|
||||
tuples2.forEach(tuple -> assertNotNull(tuple[0]));
|
||||
tuples2.forEach(tuple -> assertNotNull(tuple[1]));
|
||||
|
||||
List<EntityCopy> copies =
|
||||
// this kind of query is currently not documented to work, but it does, and I guess I don't see why it's terrible
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, names from Entity", EntityCopy.class).getResultList());
|
||||
assertEquals(2, copies.size());
|
||||
copies.forEach(Assertions::assertNotNull);
|
||||
copies.forEach(copy -> assertNotNull(copy.id));
|
||||
copies.forEach(copy -> assertNotNull(copy.name));
|
||||
|
||||
List<EntityCopy> copies2 =
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, element(names) from Entity", EntityCopy.class).getResultList());
|
||||
assertEquals(2, copies2.size());
|
||||
copies2.forEach(Assertions::assertNotNull);
|
||||
copies2.forEach(copy -> assertNotNull(copy.id));
|
||||
copies2.forEach(copy -> assertNotNull(copy.name));
|
||||
|
||||
List<EntityCopy> newCopies =
|
||||
// this kind of query is currently not documented to work, but it does, and I guess I don't see why it's terrible
|
||||
scope.fromSession(s -> s.createSelectionQuery("select new EntityCopy(id, names) from Entity", EntityCopy.class).getResultList());
|
||||
assertEquals(2, newCopies.size());
|
||||
newCopies.forEach(Assertions::assertNotNull);
|
||||
newCopies.forEach(copy -> assertNotNull(copy.id));
|
||||
newCopies.forEach(copy -> assertNotNull(copy.name));
|
||||
|
||||
List<EntityCopy> newCopies2 =
|
||||
scope.fromSession(s -> s.createSelectionQuery("select new EntityCopy(id, element(names)) from Entity", EntityCopy.class).getResultList());
|
||||
assertEquals(2, newCopies.size());
|
||||
newCopies2.forEach(Assertions::assertNotNull);
|
||||
newCopies2.forEach(copy -> assertNotNull(copy.id));
|
||||
newCopies2.forEach(copy -> assertNotNull(copy.name));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAssociation(SessionFactoryScope scope) {
|
||||
scope.getSessionFactory().getSchemaManager().truncateMappedObjects();
|
||||
|
||||
Entity entity = new Entity("hello", "world");
|
||||
entity.children.add(new ChildEntity(entity, "goodbye"));
|
||||
entity.children.add(new ChildEntity(entity, "gavin"));
|
||||
scope.inTransaction(s -> s.persist(entity));
|
||||
|
||||
List<Object[]> tuples =
|
||||
// this kind of query is currently not documented to work, but it does, and I guess I don't see why it's terrible
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, children from Entity", Object[].class).getResultList());
|
||||
assertEquals(2, tuples.size());
|
||||
tuples.forEach(tuple -> assertNotNull(tuple[0]));
|
||||
tuples.forEach(tuple -> assertNotNull(tuple[1]));
|
||||
|
||||
List<Object[]> tuples2 =
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, element(children) from Entity", Object[].class).getResultList());
|
||||
assertEquals(2, tuples2.size());
|
||||
tuples2.forEach(tuple -> assertNotNull(tuple[0]));
|
||||
tuples2.forEach(tuple -> assertNotNull(tuple[1]));
|
||||
|
||||
List<Object[]> tuples3 =
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, element(children).name from Entity", Object[].class).getResultList());
|
||||
assertEquals(2, tuples3.size());
|
||||
tuples3.forEach(tuple -> assertNotNull(tuple[0]));
|
||||
tuples3.forEach(tuple -> assertNotNull(tuple[1]));
|
||||
|
||||
List<EntityCopy> copies =
|
||||
scope.fromSession(s -> s.createSelectionQuery("select id, element(children).name from Entity", EntityCopy.class).getResultList());
|
||||
assertEquals(2, copies.size());
|
||||
copies.forEach(Assertions::assertNotNull);
|
||||
copies.forEach(copy -> assertNotNull(copy.id));
|
||||
copies.forEach(copy -> assertNotNull(copy.name));
|
||||
|
||||
List<EntityCopy> newCopies =
|
||||
scope.fromSession(s -> s.createSelectionQuery("select new EntityCopy(id, element(children).name) from Entity", EntityCopy.class).getResultList());
|
||||
assertEquals(2, newCopies.size());
|
||||
newCopies.forEach(Assertions::assertNotNull);
|
||||
newCopies.forEach(copy -> assertNotNull(copy.id));
|
||||
newCopies.forEach(copy -> assertNotNull(copy.name));
|
||||
}
|
||||
|
||||
static class EntityCopy {
|
||||
Long id;
|
||||
String name;
|
||||
|
||||
public EntityCopy(Long id, String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
@jakarta.persistence.Entity(name="Entity")
|
||||
static class Entity {
|
||||
@GeneratedValue @Id
|
||||
Long id;
|
||||
@ElementCollection
|
||||
Set<String> names;
|
||||
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
|
||||
Set<ChildEntity> children;
|
||||
|
||||
Entity(String... names) {
|
||||
this.names = Set.of(names);
|
||||
this.children = new HashSet<>();
|
||||
}
|
||||
|
||||
Entity() {
|
||||
names = new HashSet<>();
|
||||
children = new HashSet<>();
|
||||
}
|
||||
}
|
||||
|
||||
@jakarta.persistence.Entity(name="ChildEntity")
|
||||
static class ChildEntity {
|
||||
@GeneratedValue @Id Long id;
|
||||
String name;
|
||||
@ManyToOne Entity parent;
|
||||
|
||||
ChildEntity(Entity parent, String name) {
|
||||
this.parent = parent;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
ChildEntity() {
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue