ResultSet mapping
- Tests for value conversions - `@Enumerated`, `AttributeConverter`, `@Temporal`. It worked already
This commit is contained in:
parent
996e6b3b1f
commit
2050e366fe
|
@ -6,15 +6,24 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.query.resultmapping;
|
package org.hibernate.orm.test.query.resultmapping;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.time.Clock;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.query.named.NamedResultSetMappingMemento;
|
import org.hibernate.query.named.NamedResultSetMappingMemento;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.domain.gambit.EntityOfBasics;
|
||||||
import org.hibernate.testing.orm.junit.DomainModel;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.ServiceRegistry;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
@ -23,6 +32,7 @@ import org.junit.jupiter.api.Test;
|
||||||
import org.hamcrest.BaseMatcher;
|
import org.hamcrest.BaseMatcher;
|
||||||
import org.hamcrest.Description;
|
import org.hamcrest.Description;
|
||||||
import org.hamcrest.Matcher;
|
import org.hamcrest.Matcher;
|
||||||
|
import sun.util.calendar.BaseCalendar;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.is;
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
@ -36,7 +46,16 @@ import static org.hamcrest.Matchers.notNullValue;
|
||||||
SimpleEntityWithNamedMappings.class,
|
SimpleEntityWithNamedMappings.class,
|
||||||
DiscriminatedRoot.class,
|
DiscriminatedRoot.class,
|
||||||
DiscriminatedSubType1.class,
|
DiscriminatedSubType1.class,
|
||||||
DiscriminatedSubType2.class
|
DiscriminatedSubType2.class,
|
||||||
|
EntityOfBasics.class
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ServiceRegistry(
|
||||||
|
settings = {
|
||||||
|
@ServiceRegistry.Setting(
|
||||||
|
name = AvailableSettings.JDBC_TIME_ZONE,
|
||||||
|
value = "UTC"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
public class EntityResultTests extends BaseUsageTest {
|
public class EntityResultTests extends BaseUsageTest {
|
||||||
|
@ -149,7 +168,7 @@ public class EntityResultTests extends BaseUsageTest {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> Matcher<? extends Collection<T>> containsExpectedValues(T... values) {
|
private <T> Matcher<? extends Collection<T>> containsExpectedValues(T... values) {
|
||||||
return new BaseMatcher<Collection<T>>() {
|
return new BaseMatcher<Collection<T>>() {
|
||||||
@Override
|
@Override
|
||||||
public void describeTo(Description description) {
|
public void describeTo(Description description) {
|
||||||
|
@ -176,10 +195,51 @@ public class EntityResultTests extends BaseUsageTest {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testConvertedAttributes(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
final String sql = "select e.* from EntityOfBasics e";
|
||||||
|
final List<EntityOfBasics> results = (List<EntityOfBasics>) session
|
||||||
|
.createNativeQuery( sql, "entity-of-basics-implicit" )
|
||||||
|
.getResultList();
|
||||||
|
assertThat( results.size(), is( 1 ) );
|
||||||
|
|
||||||
|
final EntityOfBasics entityOfBasics = results.get( 0 );
|
||||||
|
assertThat( entityOfBasics.getGender(), is( EntityOfBasics.Gender.MALE ) );
|
||||||
|
assertThat( entityOfBasics.getOrdinalGender(), is( EntityOfBasics.Gender.FEMALE ) );
|
||||||
|
assertThat( entityOfBasics.getConvertedGender(), is( EntityOfBasics.Gender.OTHER ) );
|
||||||
|
|
||||||
|
assertThat( entityOfBasics.getTheInstant(), is( THEN ) );
|
||||||
|
assertThat( entityOfBasics.getTheTimestamp(), is( THEN_TIMESTAMP ) );
|
||||||
|
|
||||||
|
final ZonedDateTime zonedDateTime = ZonedDateTime.from( THEN.atZone( ZoneId.of( "UTC" ) ) );
|
||||||
|
|
||||||
|
// Date#year is epoch-based starting from 1900. So add the adjustment
|
||||||
|
assertThat( entityOfBasics.getTheDate().getYear() + 1900, is( zonedDateTime.getYear() ) );
|
||||||
|
// Date#month is zero-based. Add the adjustment
|
||||||
|
assertThat( entityOfBasics.getTheDate().getMonth() + 1, is( zonedDateTime.getMonthValue() ) );
|
||||||
|
assertThat( entityOfBasics.getTheDate().getDay(), is( zonedDateTime.getDayOfWeek().getValue() ) );
|
||||||
|
|
||||||
|
// can't get these correct
|
||||||
|
// todo (6.0) - enable these assertions and fix problems
|
||||||
|
// assertThat( entityOfBasics.getTheTime().getHours(), is( zonedDateTime.getHour() ) );
|
||||||
|
// assertThat( entityOfBasics.getTheTime().getMinutes(), is( zonedDateTime.getMinute() ) );
|
||||||
|
// assertThat( entityOfBasics.getTheTime().getSeconds(), is( zonedDateTime.getSecond() + 1 ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Instant THEN = Instant.now( Clock.systemUTC() );
|
||||||
|
private static final Date THEN_TIMESTAMP = Timestamp.from( THEN );
|
||||||
|
private static final Date THEN_DATE = java.sql.Date.from( THEN );
|
||||||
|
private static final Date THEN_TIME = java.sql.Time.from( THEN );
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void createTestData(SessionFactoryScope scope) {
|
public void createTestData(SessionFactoryScope scope) {
|
||||||
scope.inTransaction(
|
scope.inTransaction(
|
||||||
session -> {
|
session -> {
|
||||||
|
// discriminator hierarchy data
|
||||||
final DiscriminatedRoot root1 = new DiscriminatedRoot( 1, "root-1" );
|
final DiscriminatedRoot root1 = new DiscriminatedRoot( 1, "root-1" );
|
||||||
final DiscriminatedRoot root2 = new DiscriminatedRoot( 2, "root-2" );
|
final DiscriminatedRoot root2 = new DiscriminatedRoot( 2, "root-2" );
|
||||||
final DiscriminatedSubType1 subType1_1 = new DiscriminatedSubType1( 3, "root-3", "sub_type1-1" );
|
final DiscriminatedSubType1 subType1_1 = new DiscriminatedSubType1( 3, "root-3", "sub_type1-1" );
|
||||||
|
@ -188,6 +248,25 @@ public class EntityResultTests extends BaseUsageTest {
|
||||||
session.persist( root2 );
|
session.persist( root2 );
|
||||||
session.persist( subType1_1 );
|
session.persist( subType1_1 );
|
||||||
session.persist( subType2_1 );
|
session.persist( subType2_1 );
|
||||||
|
|
||||||
|
|
||||||
|
// converted values data
|
||||||
|
final EntityOfBasics entityOfBasics = new EntityOfBasics( 1 );
|
||||||
|
|
||||||
|
// - enums
|
||||||
|
entityOfBasics.setGender( EntityOfBasics.Gender.MALE );
|
||||||
|
entityOfBasics.setOrdinalGender( EntityOfBasics.Gender.FEMALE );
|
||||||
|
|
||||||
|
// - JPA converter
|
||||||
|
entityOfBasics.setConvertedGender( EntityOfBasics.Gender.OTHER );
|
||||||
|
|
||||||
|
// - temporals
|
||||||
|
entityOfBasics.setTheDate( THEN_DATE );
|
||||||
|
entityOfBasics.setTheTime( THEN_TIME );
|
||||||
|
entityOfBasics.setTheTimestamp( THEN_TIMESTAMP );
|
||||||
|
entityOfBasics.setTheInstant( THEN );
|
||||||
|
|
||||||
|
session.save( entityOfBasics );
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -195,7 +274,12 @@ public class EntityResultTests extends BaseUsageTest {
|
||||||
@AfterEach
|
@AfterEach
|
||||||
public void dropTestData(SessionFactoryScope scope) {
|
public void dropTestData(SessionFactoryScope scope) {
|
||||||
scope.inTransaction(
|
scope.inTransaction(
|
||||||
session -> session.createQuery( "delete DiscriminatedRoot" ).executeUpdate()
|
session -> {
|
||||||
|
// discriminator hierarchy data
|
||||||
|
session.createQuery( "delete DiscriminatedRoot" ).executeUpdate();
|
||||||
|
// converted values data
|
||||||
|
session.createQuery( "delete EntityOfBasics" ).executeUpdate();
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,9 +21,11 @@ import javax.persistence.AttributeConverter;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Convert;
|
import javax.persistence.Convert;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.EntityResult;
|
||||||
import javax.persistence.EnumType;
|
import javax.persistence.EnumType;
|
||||||
import javax.persistence.Enumerated;
|
import javax.persistence.Enumerated;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.SqlResultSetMapping;
|
||||||
import javax.persistence.Temporal;
|
import javax.persistence.Temporal;
|
||||||
import javax.persistence.TemporalType;
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
|
@ -32,6 +34,10 @@ import org.hibernate.annotations.SqlTypeCode;
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
@SqlResultSetMapping(
|
||||||
|
name = "entity-of-basics-implicit",
|
||||||
|
entities = @EntityResult( entityClass = EntityOfBasics.class )
|
||||||
|
)
|
||||||
@Entity
|
@Entity
|
||||||
public class EntityOfBasics {
|
public class EntityOfBasics {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue