Skip to content

Commit adc6059

Browse files
ouznedbrmeyer
authored andcommitted
HHH-8283 JdbcSQLException with CompositeCustomType and java.util.Date
Conflicts: hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/QueryImpl.java hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/criteria/basic/BasicCriteriaUsageTest.java
1 parent 80dc1e6 commit adc6059

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

hibernate-entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.hibernate.hql.internal.QueryExecutionRequestException;
5959
import org.hibernate.internal.SQLQueryImpl;
6060
import org.hibernate.internal.AbstractQueryImpl;
61+
import org.hibernate.type.CompositeCustomType;
6162

6263
import static javax.persistence.TemporalType.DATE;
6364
import static javax.persistence.TemporalType.TIME;
@@ -110,7 +111,7 @@ private void extractParameterInfo(Map<String,Class> namedParameterTypeRedefiniti
110111
final NamedParameterDescriptor descriptor =
111112
queryImpl.getParameterMetadata().getNamedParameterDescriptor( name );
112113
Class javaType = namedParameterTypeRedefinition.get( name );
113-
if ( javaType != null && mightNeedRedefinition( javaType ) ) {
114+
if ( javaType != null && mightNeedRedefinition( javaType, descriptor.getExpectedType().getClass() ) ) {
114115
descriptor.resetExpectedType(
115116
sfi().getTypeResolver().heuristicType( javaType.getName() )
116117
);
@@ -150,9 +151,10 @@ private SessionFactoryImplementor sfi() {
150151
return (SessionFactoryImplementor) getEntityManager().getFactory().getSessionFactory();
151152
}
152153

153-
private boolean mightNeedRedefinition(Class javaType) {
154-
// for now, only really no for dates/times/timestamps
155-
return java.util.Date.class.isAssignableFrom( javaType );
154+
private boolean mightNeedRedefinition(Class javaType, Class expectedType) {
155+
// only redefine dates/times/timestamps that are not wrapped in a CompositeCustomType
156+
return java.util.Date.class.isAssignableFrom( javaType )
157+
&& !CompositeCustomType.class.isAssignableFrom( expectedType );
156158
}
157159

158160
private static class ParameterImpl implements Parameter {

hibernate-entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/BasicCriteriaUsageTest.java

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,33 @@
2323
*/
2424
package org.hibernate.ejb.criteria.basic;
2525

26+
import static org.junit.Assert.assertEquals;
27+
import static org.junit.Assert.assertNotNull;
28+
29+
import java.math.BigDecimal;
30+
import java.util.Date;
31+
import java.util.List;
32+
2633
import javax.persistence.EntityManager;
34+
import javax.persistence.TypedQuery;
2735
import javax.persistence.criteria.CriteriaQuery;
2836
import javax.persistence.criteria.ParameterExpression;
2937
import javax.persistence.criteria.Predicate;
3038
import javax.persistence.criteria.Root;
3139
import javax.persistence.metamodel.SingularAttribute;
3240

33-
import org.junit.Test;
34-
3541
import org.hibernate.ejb.test.BaseEntityManagerFunctionalTestCase;
36-
37-
import static org.junit.Assert.assertEquals;
38-
import static org.junit.Assert.assertNotNull;
42+
import org.hibernate.ejb.criteria.basic.Payment_;
43+
import org.hibernate.testing.TestForIssue;
44+
import org.junit.Test;
3945

4046
/**
4147
* @author Steve Ebersole
4248
*/
4349
public class BasicCriteriaUsageTest extends BaseEntityManagerFunctionalTestCase {
4450
@Override
4551
public Class[] getAnnotatedClasses() {
46-
return new Class[] { Wall.class };
52+
return new Class[] { Wall.class, Payment.class };
4753
}
4854

4955
@Test
@@ -74,4 +80,29 @@ public void testTrivialCompilation() {
7480
em.getTransaction().commit();
7581
em.close();
7682
}
83+
84+
@Test
85+
@TestForIssue(jiraKey = "HHH-8283")
86+
public void testDateCompositeCustomType() {
87+
Payment payment = new Payment();
88+
payment.setAmount( new BigDecimal( 1000 ) );
89+
payment.setDate( new Date() );
90+
91+
EntityManager em = getOrCreateEntityManager();
92+
em.getTransaction().begin();
93+
em.persist( payment );
94+
95+
CriteriaQuery<Payment> criteria = em.getCriteriaBuilder().createQuery( Payment.class );
96+
Root<Payment> rp = criteria.from( Payment.class );
97+
Predicate predicate = em.getCriteriaBuilder().equal( rp.get( Payment_.date ), new Date() );
98+
criteria.where( predicate );
99+
100+
TypedQuery<Payment> q = em.createQuery( criteria );
101+
List<Payment> payments = q.getResultList();
102+
103+
assertEquals( 1, payments.size() );
104+
105+
em.getTransaction().commit();
106+
em.close();
107+
}
77108
}

0 commit comments

Comments
 (0)