HHH-8237 Applying type configured via @ColumnMapping#type() for constructor results
This commit is contained in:
parent
14c00abd6a
commit
d84c6b35aa
|
@ -200,7 +200,7 @@ public class ResultsetMappingSecondPass implements QuerySecondPass {
|
||||||
columnReturns.add(
|
columnReturns.add(
|
||||||
new NativeSQLQueryScalarReturn(
|
new NativeSQLQueryScalarReturn(
|
||||||
mappings.getObjectNameNormalizer().normalizeIdentifierQuoting( columnResult.name() ),
|
mappings.getObjectNameNormalizer().normalizeIdentifierQuoting( columnResult.name() ),
|
||||||
null
|
columnResult.type() != null ? mappings.getTypeResolver().heuristicType( columnResult.type().getName() ) : null
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,12 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.query;
|
package org.hibernate.jpa.test.query;
|
||||||
|
|
||||||
|
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.ColumnResult;
|
import javax.persistence.ColumnResult;
|
||||||
import javax.persistence.ConstructorResult;
|
import javax.persistence.ConstructorResult;
|
||||||
|
@ -33,22 +39,12 @@ import javax.persistence.NamedNativeQueries;
|
||||||
import javax.persistence.NamedNativeQuery;
|
import javax.persistence.NamedNativeQuery;
|
||||||
import javax.persistence.SqlResultSetMapping;
|
import javax.persistence.SqlResultSetMapping;
|
||||||
import javax.persistence.SqlResultSetMappings;
|
import javax.persistence.SqlResultSetMappings;
|
||||||
import javax.persistence.Table;
|
|
||||||
import javax.persistence.Temporal;
|
import javax.persistence.Temporal;
|
||||||
import javax.persistence.TemporalType;
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
|
||||||
|
|
||||||
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
|
@ -86,6 +82,19 @@ public class ConstructorResultNativeQueryTest extends BaseEntityManagerFunctiona
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
),
|
||||||
|
@SqlResultSetMapping(
|
||||||
|
name = "person-id-and-name-and-weight",
|
||||||
|
classes = {
|
||||||
|
@ConstructorResult(
|
||||||
|
targetClass = Person.class,
|
||||||
|
columns = {
|
||||||
|
@ColumnResult( name = "id" ),
|
||||||
|
@ColumnResult( name = "p_name" ),
|
||||||
|
@ColumnResult( name = "p_weight", type=String.class )
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -100,6 +109,11 @@ public class ConstructorResultNativeQueryTest extends BaseEntityManagerFunctiona
|
||||||
name = "person-id-and-name2",
|
name = "person-id-and-name2",
|
||||||
query = "select p.id, p.p_name, p.id as id2, p.p_name as p_name2 from person p order by p.p_name",
|
query = "select p.id, p.p_name, p.id as id2, p.p_name as p_name2 from person p order by p.p_name",
|
||||||
resultSetMapping = "person-id-and-name2"
|
resultSetMapping = "person-id-and-name2"
|
||||||
|
),
|
||||||
|
@NamedNativeQuery(
|
||||||
|
name = "person-id-and-name-and-weight",
|
||||||
|
query = "select p.id, p.p_name, p.p_weight from person p order by p.p_name",
|
||||||
|
resultSetMapping = "person-id-and-name-and-weight"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -110,6 +124,8 @@ public class ConstructorResultNativeQueryTest extends BaseEntityManagerFunctiona
|
||||||
private String name;
|
private String name;
|
||||||
@Temporal( TemporalType.TIMESTAMP )
|
@Temporal( TemporalType.TIMESTAMP )
|
||||||
private Date birthDate;
|
private Date birthDate;
|
||||||
|
@Column( name = "p_weight" )
|
||||||
|
private int weight;
|
||||||
|
|
||||||
public Person() {
|
public Person() {
|
||||||
}
|
}
|
||||||
|
@ -124,6 +140,12 @@ public class ConstructorResultNativeQueryTest extends BaseEntityManagerFunctiona
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Person(Integer id, String name, String weight) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
this.weight = Integer.valueOf(weight);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -184,4 +206,27 @@ public class ConstructorResultNativeQueryTest extends BaseEntityManagerFunctiona
|
||||||
em.getTransaction().commit();
|
em.getTransaction().commit();
|
||||||
em.close();
|
em.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testConstructorResultNativeQuerySpecifyingType() {
|
||||||
|
EntityManager em = getOrCreateEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
em.persist( new Person( 1, "John", "85" ) );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
|
||||||
|
em = getOrCreateEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
List results = em.createNamedQuery( "person-id-and-name-and-weight" ).getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
assertTyping( Person.class, results.get( 0 ) );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
|
||||||
|
em = getOrCreateEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
em.createQuery( "delete from Person" ).executeUpdate();
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue