HHH-8444 - Fix criteriaapi failures from JPA 2.1 TCK
This commit is contained in:
parent
05144811e4
commit
6162a4b394
|
@ -499,7 +499,18 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <X> X get(int i, Class<X> type) {
|
public <X> X get(int i, Class<X> type) {
|
||||||
return (X) get( i );
|
final Object result = get( i );
|
||||||
|
if ( result != null && ! type.isInstance( result ) ) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format(
|
||||||
|
"Requested tuple value [index=%s, realType=%s] cannot be assigned to requested type [%s]",
|
||||||
|
i,
|
||||||
|
result.getClass().getName(),
|
||||||
|
type.getName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return ( X ) result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -661,7 +672,18 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
|
||||||
}
|
}
|
||||||
|
|
||||||
public <X> X get(int i, Class<X> type) {
|
public <X> X get(int i, Class<X> type) {
|
||||||
return ( X ) get( i );
|
final Object result = get( i );
|
||||||
|
if ( result != null && ! type.isInstance( result ) ) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format(
|
||||||
|
"Requested tuple value [index=%s, realType=%s] cannot be assigned to requested type [%s]",
|
||||||
|
i,
|
||||||
|
result.getClass().getName(),
|
||||||
|
type.getName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return ( X ) result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object[] toArray() {
|
public Object[] toArray() {
|
||||||
|
|
|
@ -37,13 +37,16 @@ import org.hibernate.jpa.test.metamodel.AbstractMetamodelSpecificTest;
|
||||||
import org.hibernate.jpa.test.metamodel.Customer;
|
import org.hibernate.jpa.test.metamodel.Customer;
|
||||||
import org.hibernate.jpa.test.metamodel.Customer_;
|
import org.hibernate.jpa.test.metamodel.Customer_;
|
||||||
|
|
||||||
|
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
*/
|
*/
|
||||||
public class TupleCriteriaTest extends AbstractMetamodelSpecificTest {
|
public class TupleCriteriaTest extends AbstractMetamodelSpecificTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testArray() {
|
public void testArray() {
|
||||||
EntityManager em = entityManagerFactory().createEntityManager();
|
EntityManager em = entityManagerFactory().createEntityManager();
|
||||||
|
@ -120,4 +123,60 @@ public class TupleCriteriaTest extends AbstractMetamodelSpecificTest {
|
||||||
em.close();
|
em.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInvalidTupleIndexAccess() {
|
||||||
|
EntityManager em = entityManagerFactory().createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Customer c1 = new Customer();
|
||||||
|
c1.setId( "c1" );
|
||||||
|
c1.setAge( 18 );
|
||||||
|
c1.setName( "Bob" );
|
||||||
|
em.persist( c1 );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
|
||||||
|
// the actual assertion block
|
||||||
|
em = entityManagerFactory().createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
final CriteriaBuilder builder = em.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
|
||||||
|
Root<Customer> customerRoot = criteria.from( Customer.class );
|
||||||
|
criteria.multiselect( customerRoot.get( Customer_.name ), customerRoot.get( Customer_.age ) );
|
||||||
|
List<Tuple> results = em.createQuery( criteria ).getResultList();
|
||||||
|
assertEquals( 1, results.size() );
|
||||||
|
Tuple tuple = results.get( 0 );
|
||||||
|
try {
|
||||||
|
tuple.get( 99 );
|
||||||
|
fail( "99 is invalid index" );
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException expected) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
tuple.get( 99, String.class );
|
||||||
|
fail( "99 is invalid index" );
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException expected) {
|
||||||
|
}
|
||||||
|
|
||||||
|
tuple.get( 0, String.class );
|
||||||
|
tuple.get( 1, Integer.class );
|
||||||
|
|
||||||
|
try {
|
||||||
|
tuple.get( 0, java.util.Date.class );
|
||||||
|
fail( "Date is invalid type" );
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException expected) {
|
||||||
|
}
|
||||||
|
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
|
||||||
|
em = entityManagerFactory().createEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
em.createQuery( "delete Customer" ).executeUpdate();
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue