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;
|
||||
|
||||
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.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
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.ServiceRegistry;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
|
@ -23,6 +32,7 @@ import org.junit.jupiter.api.Test;
|
|||
import org.hamcrest.BaseMatcher;
|
||||
import org.hamcrest.Description;
|
||||
import org.hamcrest.Matcher;
|
||||
import sun.util.calendar.BaseCalendar;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
@ -36,7 +46,16 @@ import static org.hamcrest.Matchers.notNullValue;
|
|||
SimpleEntityWithNamedMappings.class,
|
||||
DiscriminatedRoot.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 {
|
||||
|
@ -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>>() {
|
||||
@Override
|
||||
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
|
||||
public void createTestData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
// discriminator hierarchy data
|
||||
final DiscriminatedRoot root1 = new DiscriminatedRoot( 1, "root-1" );
|
||||
final DiscriminatedRoot root2 = new DiscriminatedRoot( 2, "root-2" );
|
||||
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( subType1_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
|
||||
public void dropTestData(SessionFactoryScope scope) {
|
||||
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.Convert;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.EntityResult;
|
||||
import javax.persistence.EnumType;
|
||||
import javax.persistence.Enumerated;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.SqlResultSetMapping;
|
||||
import javax.persistence.Temporal;
|
||||
import javax.persistence.TemporalType;
|
||||
|
||||
|
@ -32,6 +34,10 @@ import org.hibernate.annotations.SqlTypeCode;
|
|||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@SqlResultSetMapping(
|
||||
name = "entity-of-basics-implicit",
|
||||
entities = @EntityResult( entityClass = EntityOfBasics.class )
|
||||
)
|
||||
@Entity
|
||||
public class EntityOfBasics {
|
||||
|
||||
|
|
Loading…
Reference in New Issue