Skip to content

Commit 0255061

Browse files
committed
HHH-18490 Add test for issue
1 parent b269773 commit 0255061

File tree

6 files changed

+212
-0
lines changed

6 files changed

+212
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.metamodel.generics.embeddable;
8+
9+
import java.io.Serializable;
10+
11+
import jakarta.persistence.Column;
12+
import jakarta.persistence.MappedSuperclass;
13+
14+
@MappedSuperclass
15+
public abstract class AbstractValueObject<V extends Comparable<V>> implements Serializable,
16+
Comparable<AbstractValueObject<V>> {
17+
public static final String VALUE = "value";
18+
19+
@Column( name = "value_col" )
20+
private V value;
21+
22+
protected AbstractValueObject() {
23+
super();
24+
}
25+
26+
protected AbstractValueObject(final V value) {
27+
this.value = value;
28+
}
29+
30+
@Override
31+
public int compareTo(final AbstractValueObject<V> object) {
32+
return value.compareTo( object.value );
33+
}
34+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.metamodel.generics.embeddable;
8+
9+
import java.util.Date;
10+
11+
import jakarta.persistence.Embeddable;
12+
13+
@Embeddable
14+
public class CreationDate extends AbstractValueObject<Date> {
15+
protected CreationDate() {
16+
super();
17+
}
18+
19+
public CreationDate(final Date value) {
20+
super( value );
21+
}
22+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.metamodel.generics.embeddable;
8+
9+
import java.util.Date;
10+
11+
import org.hibernate.SessionFactory;
12+
13+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
14+
import org.hibernate.testing.orm.junit.Jira;
15+
import org.hibernate.testing.orm.junit.Jpa;
16+
import org.junit.jupiter.api.AfterAll;
17+
import org.junit.jupiter.api.BeforeAll;
18+
import org.junit.jupiter.api.Test;
19+
20+
import jakarta.persistence.Tuple;
21+
import jakarta.persistence.TypedQuery;
22+
import jakarta.persistence.criteria.CriteriaBuilder;
23+
import jakarta.persistence.criteria.CriteriaQuery;
24+
import jakarta.persistence.criteria.Expression;
25+
import jakarta.persistence.criteria.Path;
26+
import jakarta.persistence.criteria.Root;
27+
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
30+
/**
31+
* @author Marco Belladelli
32+
*/
33+
@Jpa( annotatedClasses = {
34+
Parent.class,
35+
AbstractValueObject.class,
36+
CreationDate.class,
37+
SomeNumber.class,
38+
SomeString.class,
39+
} )
40+
@Jira( "https://hibernate.atlassian.net/browse/HHH-18490" )
41+
public class GenericEmbeddableSuperclassMetamodelTest {
42+
@SuppressWarnings( { "rawtypes", "unchecked" } )
43+
@Test
44+
public void test(EntityManagerFactoryScope scope) {
45+
scope.inTransaction( entityManager -> {
46+
final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
47+
final CriteriaQuery<Tuple> cq = cb.createTupleQuery();
48+
final Root<Parent> from = cq.from( Parent.class );
49+
50+
final Path someStringPath = from.get( Parent_.someString ).get( SomeString_.value );
51+
final Path someNumberPath = from.get( Parent_.someNumber ).get( SomeNumber_.value );
52+
final Path timestampPath = from.get( Parent_.date ).get( CreationDate_.value );
53+
final Expression<Integer> maxNumber = cb.max( someNumberPath );
54+
final Expression<Date> maxTimestamp = cb.function( "max", Date.class, timestampPath );
55+
cq.select( cb.tuple( someStringPath, maxTimestamp, maxNumber ) );
56+
cq.groupBy( someStringPath );
57+
58+
final TypedQuery<Tuple> query = entityManager.createQuery( cq );
59+
final Tuple result = query.getSingleResult();
60+
61+
assertThat( result.get( 0, String.class ) ).isEqualTo( "something" );
62+
assertThat( result.get( 1, Date.class ) ).isNotNull();
63+
assertThat( result.get( 2, Object.class ) ).isEqualTo( 42 );
64+
} );
65+
}
66+
67+
@BeforeAll
68+
public void setUp(EntityManagerFactoryScope scope) {
69+
scope.inTransaction( entityManager -> entityManager.persist( new Parent(
70+
new SomeString( "something" ),
71+
new CreationDate( new Date() ),
72+
new SomeNumber( 42 )
73+
) ) );
74+
}
75+
76+
@AfterAll
77+
public void tearDown(EntityManagerFactoryScope scope) {
78+
scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getSchemaManager().truncateMappedObjects();
79+
}
80+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.metamodel.generics.embeddable;
8+
9+
import jakarta.persistence.AttributeOverride;
10+
import jakarta.persistence.Column;
11+
import jakarta.persistence.Embedded;
12+
import jakarta.persistence.Entity;
13+
import jakarta.persistence.GeneratedValue;
14+
import jakarta.persistence.Id;
15+
16+
import static org.hibernate.orm.test.metamodel.generics.embeddable.AbstractValueObject.VALUE;
17+
18+
@Entity
19+
public class Parent {
20+
@Id
21+
@GeneratedValue
22+
private Long id;
23+
24+
@Embedded
25+
@AttributeOverride( name = VALUE, column = @Column( name = "some_string" ) )
26+
private SomeString someString;
27+
28+
@Embedded
29+
@AttributeOverride( name = VALUE, column = @Column( name = "some_date" ) )
30+
private CreationDate date;
31+
32+
@Embedded
33+
@AttributeOverride( name = VALUE, column = @Column( name = "some_number" ) )
34+
private SomeNumber someNumber;
35+
36+
public Parent() {
37+
}
38+
39+
public Parent(final SomeString someString, final CreationDate date, final SomeNumber someNumber) {
40+
this.someString = someString;
41+
this.date = date;
42+
this.someNumber = someNumber;
43+
}
44+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.metamodel.generics.embeddable;
8+
9+
import jakarta.persistence.Embeddable;
10+
11+
@Embeddable
12+
public class SomeNumber extends AbstractValueObject<Integer> {
13+
protected SomeNumber() {
14+
}
15+
16+
public SomeNumber(final Integer value) {
17+
super( value );
18+
}
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.hibernate.orm.test.metamodel.generics.embeddable;
2+
3+
import jakarta.persistence.Embeddable;
4+
5+
@Embeddable
6+
public class SomeString extends AbstractValueObject<String> {
7+
protected SomeString() {
8+
}
9+
10+
public SomeString(final String value) {
11+
super( value );
12+
}
13+
}

0 commit comments

Comments
 (0)