Skip to content

Commit ad26e73

Browse files
committed
HHH-17377 - Migrate to JPA 3.2
https://hibernate.atlassian.net/browse/HHH-17377 JPA 3.2 B02
1 parent f886510 commit ad26e73

20 files changed

+267
-53
lines changed

hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/stax/ConfigurationEventReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class ConfigurationEventReader extends AbstractEventReader {
2020
public ConfigurationEventReader(XMLEventReader reader, XMLEventFactory xmlEventFactory) {
2121
super(
2222
ROOT_ELEMENT_NAME,
23-
ConfigXsdSupport.configurationXsd(),
23+
ConfigXsdSupport.getJPA32(),
2424
reader,
2525
xmlEventFactory
2626
);

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import jakarta.persistence.RefreshOption;
7373
import jakarta.persistence.criteria.CriteriaDelete;
7474
import jakarta.persistence.criteria.CriteriaQuery;
75+
import jakarta.persistence.criteria.CriteriaSelect;
7576
import jakarta.persistence.criteria.CriteriaUpdate;
7677
import jakarta.persistence.metamodel.Metamodel;
7778
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -507,6 +508,11 @@ public RootGraphImplementor<?> getEntityGraph(String graphName) {
507508
return delegate.getEntityGraph( graphName );
508509
}
509510

511+
@Override
512+
public <T> QueryImplementor<T> createQuery(CriteriaSelect<T> selectQuery) {
513+
return delegate.createQuery( selectQuery );
514+
}
515+
510516
@Override
511517
public <T> List<EntityGraph<? super T>> getEntityGraphs(Class<T> entityClass) {
512518
return delegate.getEntityGraphs( entityClass );

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionImplementor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
import org.hibernate.event.spi.RefreshContext;
1818
import org.hibernate.graph.spi.RootGraphImplementor;
1919
import org.hibernate.persister.entity.EntityPersister;
20+
import org.hibernate.query.spi.QueryImplementor;
2021
import org.hibernate.resource.jdbc.spi.JdbcSessionOwner;
2122
import org.hibernate.resource.transaction.spi.TransactionCoordinator;
2223
import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder;
2324
import org.hibernate.type.descriptor.WrapperOptions;
2425

26+
import jakarta.persistence.criteria.CriteriaSelect;
27+
2528
/**
2629
* Defines the "internal contract" between {@link Session} and other parts of Hibernate
2730
* including implementors of {@link org.hibernate.type.Type}, {@link EntityPersister},
@@ -77,6 +80,9 @@ default SessionImplementor getSession() {
7780
@Override
7881
RootGraphImplementor<?> getEntityGraph(String graphName);
7982

83+
@Override
84+
<T> QueryImplementor<T> createQuery(CriteriaSelect<T> selectQuery);
85+
8086
/**
8187
* Get the {@link ActionQueue} associated with this session.
8288
*/

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@
5353
import jakarta.persistence.LockModeType;
5454
import jakarta.persistence.LockOption;
5555
import jakarta.persistence.RefreshOption;
56+
import jakarta.persistence.TypedQuery;
5657
import jakarta.persistence.criteria.CriteriaDelete;
5758
import jakarta.persistence.criteria.CriteriaQuery;
59+
import jakarta.persistence.criteria.CriteriaSelect;
5860
import jakarta.persistence.criteria.CriteriaUpdate;
5961
import jakarta.persistence.metamodel.Metamodel;
6062
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -591,6 +593,11 @@ public <R> Query<R> createQuery(CriteriaQuery<R> criteriaQuery) {
591593
return this.lazySession.get().createQuery( criteriaQuery );
592594
}
593595

596+
@Override
597+
public <T> TypedQuery<T> createQuery(CriteriaSelect<T> selectQuery) {
598+
return this.lazySession.get().createQuery( selectQuery );
599+
}
600+
594601
@SuppressWarnings("rawtypes")
595602
@Override
596603
@Deprecated

hibernate-core/src/main/java/org/hibernate/graph/internal/AbstractGraph.java

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.List;
1212
import java.util.Map;
1313
import java.util.concurrent.ConcurrentHashMap;
14+
import java.util.function.Consumer;
1415

1516
import org.hibernate.graph.AttributeNode;
1617
import org.hibernate.graph.CannotBecomeEntityGraphException;
@@ -95,6 +96,42 @@ public void merge(GraphImplementor<? extends J> other) {
9596
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9697
// AttributeNode handling
9798

99+
100+
@Override
101+
public <Y> AttributeNodeImplementor<Y> getAttributeNode(String attributeName) {
102+
if ( attrNodeMap == null ) {
103+
return null;
104+
}
105+
final PersistentAttribute<? super J, ?> attribute = managedType.findAttributeInSuperTypes( attributeName );
106+
//noinspection unchecked
107+
return (AttributeNodeImplementor<Y>) attrNodeMap.get( attribute );
108+
}
109+
110+
@Override
111+
public <Y> AttributeNodeImplementor<Y> getAttributeNode(Attribute<? super J, Y> attribute) {
112+
return null;
113+
}
114+
115+
@Override
116+
public void visitAttributeNodes(Consumer<AttributeNodeImplementor<?>> consumer) {
117+
if ( attrNodeMap == null ) {
118+
return;
119+
}
120+
attrNodeMap.forEach( (persistentAttribute, attributeNodeImplementor) -> {
121+
consumer.accept( attributeNodeImplementor );
122+
} );
123+
}
124+
125+
@Override
126+
public List<AttributeNode<?>> getAttributeNodeList() {
127+
if ( attrNodeMap == null ) {
128+
return emptyList();
129+
}
130+
final List<AttributeNode<?>> result = new ArrayList<>();
131+
visitAttributeNodes( result::add );
132+
return result;
133+
}
134+
98135
@Override
99136
public AttributeNodeImplementor<?> addAttributeNode(AttributeNodeImplementor<?> incomingAttributeNode) {
100137
verifyMutability();
@@ -151,8 +188,8 @@ public List<AttributeNodeImplementor<?>> getAttributeNodeImplementors() {
151188
}
152189

153190
@Override
154-
public void addAttributeNode(String attributeName) throws CannotContainSubGraphException {
155-
findOrCreateAttributeNode( attributeName );
191+
public <AJ> AttributeNodeImplementor<AJ> addAttributeNode(String attributeName) throws CannotContainSubGraphException {
192+
return findOrCreateAttributeNode( attributeName );
156193
}
157194

158195
@Override
@@ -162,8 +199,9 @@ public <AJ> AttributeNodeImplementor<AJ> addAttributeNode(PersistentAttribute<?
162199
}
163200

164201
@Override
165-
public void addAttributeNode(Attribute<? super J, ?> attribute) {
166-
findOrCreateAttributeNode( (PersistentAttribute<? super J, ?>) attribute );
202+
public <Y> AttributeNodeImplementor<Y> addAttributeNode(Attribute<? super J, Y> attribute) {
203+
//noinspection unchecked
204+
return (AttributeNodeImplementor<Y>) findOrCreateAttributeNode( (PersistentAttribute<? super J, ?>) attribute );
167205
}
168206

169207
@Override

hibernate-core/src/main/java/org/hibernate/graph/spi/GraphImplementor.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.hibernate.metamodel.model.domain.PersistentAttribute;
1717
import org.hibernate.query.sqm.SqmPathSource;
1818

19+
import jakarta.persistence.metamodel.Attribute;
20+
1921
/**
2022
* Integration version of the {@link Graph} contract
2123
*
@@ -49,6 +51,16 @@ default void visitAttributeNodes(Consumer<AttributeNodeImplementor<?>> consumer)
4951
getAttributeNodeImplementors().forEach( consumer );
5052
}
5153

54+
@Override
55+
default boolean hasAttributeNode(String attributeName) {
56+
return getAttributeNode( attributeName ) != null;
57+
}
58+
59+
@Override
60+
default boolean hasAttributeNode(Attribute<? super J, ?> attribute) {
61+
return getAttributeNode( attribute ) != null;
62+
}
63+
5264
AttributeNodeImplementor<?> addAttributeNode(AttributeNodeImplementor<?> makeCopy);
5365

5466
List<AttributeNodeImplementor<?>> getAttributeNodeImplementors();
@@ -66,7 +78,10 @@ default List<AttributeNode<?>> getAttributeNodeList() {
6678
<AJ> AttributeNodeImplementor<AJ> findAttributeNode(PersistentAttribute<? super J, AJ> attribute);
6779

6880
@Override
69-
void addAttributeNode(String attributeName) throws CannotContainSubGraphException;
81+
<AJ> AttributeNodeImplementor<AJ> addAttributeNode(String attributeName) throws CannotContainSubGraphException;
82+
83+
@Override
84+
<Y> AttributeNodeImplementor<Y> addAttributeNode(Attribute<? super J, Y> attribute);
7085

7186
@Override
7287
<AJ> AttributeNodeImplementor<AJ> addAttributeNode(PersistentAttribute<? super J, AJ> attribute)

hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,7 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> exp
856856
return interpretAndCreateSelectionQuery( hqlString, expectedResultType );
857857
}
858858

859+
859860
@Override
860861
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
861862
if ( criteria instanceof CriteriaDefinition ) {
@@ -1476,7 +1477,7 @@ public QueryImplementor createQuery(@SuppressWarnings("rawtypes") CriteriaDelete
14761477
}
14771478
}
14781479

1479-
private <T> QueryImplementor<T> createCriteriaQuery(SqmStatement<T> criteria, Class<T> resultType) {
1480+
protected <T> QueryImplementor<T> createCriteriaQuery(SqmStatement<T> criteria, Class<T> resultType) {
14801481
final QuerySqmImpl<T> query = new QuerySqmImpl<>( criteria, resultType, this );
14811482
applyQuerySettingsAndHints( query );
14821483
return query;

hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@
124124
import org.hibernate.query.Query;
125125
import org.hibernate.query.SelectionQuery;
126126
import org.hibernate.query.UnknownSqlResultSetMappingException;
127+
import org.hibernate.query.criteria.CriteriaDefinition;
128+
import org.hibernate.query.spi.QueryImplementor;
129+
import org.hibernate.query.sqm.tree.select.SqmQueryGroup;
130+
import org.hibernate.query.sqm.tree.select.SqmQuerySpec;
131+
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
127132
import org.hibernate.resource.jdbc.spi.JdbcSessionOwner;
128133
import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode;
129134
import org.hibernate.resource.jdbc.spi.StatementInspector;
@@ -148,6 +153,7 @@
148153
import jakarta.persistence.PersistenceException;
149154
import jakarta.persistence.RefreshOption;
150155
import jakarta.persistence.TransactionRequiredException;
156+
import jakarta.persistence.criteria.CriteriaSelect;
151157
import jakarta.persistence.metamodel.Metamodel;
152158

153159
import static java.lang.Boolean.parseBoolean;
@@ -1719,6 +1725,35 @@ public SessionFactoryImplementor getSessionFactory() {
17191725
return getFactory();
17201726
}
17211727

1728+
@Override
1729+
public <T> QueryImplementor<T> createQuery(CriteriaSelect<T> selectQuery) {
1730+
checkOpen();
1731+
if ( selectQuery instanceof CriteriaDefinition ) {
1732+
return (QueryImplementor<T>) ((CriteriaDefinition<T>) selectQuery).createSelectionQuery(this);
1733+
}
1734+
else {
1735+
try {
1736+
final SqmSelectStatement<T> selectStatement = (SqmSelectStatement<T>) selectQuery;
1737+
if ( ! ( selectStatement.getQueryPart() instanceof SqmQueryGroup ) ) {
1738+
final SqmQuerySpec<T> querySpec = selectStatement.getQuerySpec();
1739+
if ( querySpec.getSelectClause().getSelections().isEmpty() ) {
1740+
if ( querySpec.getFromClause().getRoots().size() == 1 ) {
1741+
querySpec.getSelectClause().setSelection( querySpec.getFromClause().getRoots().get(0) );
1742+
}
1743+
}
1744+
}
1745+
1746+
return createCriteriaQuery( selectStatement, selectStatement.getResultType() );
1747+
}
1748+
catch (RuntimeException e) {
1749+
if ( getSessionFactory().getJpaMetamodel().getJpaCompliance().isJpaTransactionComplianceEnabled() ) {
1750+
markForRollbackOnly();
1751+
}
1752+
throw getExceptionConverter().convert( e );
1753+
}
1754+
}
1755+
}
1756+
17221757
@Override
17231758
public void initializeCollection(PersistentCollection<?> collection, boolean writing) {
17241759
checkOpenOrWaitingForAutoClose();

hibernate-core/src/main/java/org/hibernate/query/QueryProducer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,7 @@ public interface QueryProducer {
166166
*
167167
* @apiNote Changes in JPA 3.2 required de-typing this to be compilable with their changes
168168
*/
169-
@SuppressWarnings("rawtypes")
170-
NativeQuery createNativeQuery(String sqlString, Class<?> resultClass);
169+
<R> NativeQuery<R> createNativeQuery(String sqlString, Class<R> resultClass);
171170

172171
/**
173172
* Create a {@link NativeQuery} instance for the given native SQL query

hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@
2525
import org.hibernate.query.SortDirection;
2626
import org.hibernate.query.sqm.FrameKind;
2727
import org.hibernate.query.sqm.TemporalUnit;
28+
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
2829

2930
import jakarta.persistence.Tuple;
3031
import jakarta.persistence.criteria.AbstractQuery;
3132
import jakarta.persistence.criteria.CollectionJoin;
3233
import jakarta.persistence.criteria.CriteriaBuilder;
3334
import jakarta.persistence.criteria.CriteriaQuery;
35+
import jakarta.persistence.criteria.CriteriaSelect;
3436
import jakarta.persistence.criteria.Expression;
3537
import jakarta.persistence.criteria.Join;
3638
import jakarta.persistence.criteria.ListJoin;
@@ -176,28 +178,34 @@ default <T> JpaCriteriaQuery<T> except(CriteriaQuery<? extends T> query1, Criter
176178

177179
<T> JpaCriteriaQuery<T> except(boolean all, CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries);
178180

179-
default <T> JpaSubQuery<T> unionAll(Subquery<? extends T> query1, Subquery<?>... queries) {
180-
return union( true, query1, queries );
181-
}
182-
183181
@Override
184-
<T> JpaCriteriaQuery<T> union(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right);
182+
<T> CriteriaSelect<T> union(CriteriaSelect<? extends T> left, CriteriaSelect<? extends T> right);
185183

186-
@Override
187-
default <T> JpaCriteriaQuery<T> unionAll(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right) {
188-
return null;
189-
}
184+
<T> JpaCriteriaQuery<T> union(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right);
190185

191186
default <T> JpaSubQuery<T> union(Subquery<? extends T> query1, Subquery<?>... queries) {
192187
return union( false, query1, queries );
193188
}
194189

195190
<T> JpaSubQuery<T> union(boolean all, Subquery<? extends T> query1, Subquery<?>... queries);
196191

192+
default <T> JpaSubQuery<T> unionAll(Subquery<? extends T> query1, Subquery<?>... queries) {
193+
return union( true, query1, queries );
194+
}
195+
197196
@Override
198-
<T> JpaCriteriaQuery<T> intersect(CriteriaQuery<? super T> left, CriteriaQuery<? super T> right);
197+
<T> CriteriaSelect<T> unionAll(CriteriaSelect<? extends T> left, CriteriaSelect<? extends T> right);
198+
199+
<T> JpaCriteriaQuery<T> unionAll(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right);
200+
201+
@Override
202+
<T> CriteriaSelect<T> intersect(CriteriaSelect<? super T> left, CriteriaSelect<? super T> right);
199203

200204
@Override
205+
<T> CriteriaSelect<T> intersectAll(CriteriaSelect<? super T> left, CriteriaSelect<? super T> right);
206+
207+
<T> JpaCriteriaQuery<T> intersect(CriteriaQuery<? super T> left, CriteriaQuery<? super T> right);
208+
201209
<T> JpaCriteriaQuery<T> intersectAll(CriteriaQuery<? super T> left, CriteriaQuery<? super T> right);
202210

203211
default <T> JpaSubQuery<T> intersectAll(Subquery<? extends T> query1, Subquery<?>... queries) {
@@ -211,9 +219,13 @@ default <T> JpaSubQuery<T> intersect(Subquery<? extends T> query1, Subquery<?>..
211219
<T> JpaSubQuery<T> intersect(boolean all, Subquery<? extends T> query1, Subquery<?>... queries);
212220

213221
@Override
214-
<T> JpaCriteriaQuery<T> except(CriteriaQuery<T> left, CriteriaQuery<?> right);
222+
<T> CriteriaSelect<T> except(CriteriaSelect<T> left, CriteriaSelect<?> right);
215223

216224
@Override
225+
<T> CriteriaSelect<T> exceptAll(CriteriaSelect<T> left, CriteriaSelect<?> right);
226+
227+
<T> JpaCriteriaQuery<T> except(CriteriaQuery<T> left, CriteriaQuery<?> right);
228+
217229
<T> JpaCriteriaQuery<T> exceptAll(CriteriaQuery<T> left, CriteriaQuery<?> right);
218230

219231
default <T> JpaSubQuery<T> exceptAll(Subquery<? extends T> query1, Subquery<?>... queries) {
@@ -368,11 +380,11 @@ default <T> JpaSubQuery<T> except(Subquery<? extends T> query1, Subquery<?>... q
368380

369381
@Override
370382
JpaCompoundSelection<Tuple> tuple(Selection<?>... selections);
371-
JpaCompoundSelection<Tuple> tuple(List<? extends JpaSelection<?>> selections);
383+
JpaCompoundSelection<Tuple> tuple(List<Selection<?>> selections);
372384

373385
@Override
374386
JpaCompoundSelection<Object[]> array(Selection<?>... selections);
375-
JpaCompoundSelection<Object[]> array(List<? extends JpaSelection<?>> selections);
387+
JpaCompoundSelection<Object[]> array(List<Selection<?>> selections);
376388

377389
<Y> JpaCompoundSelection<Y> array(Class<Y> resultClass, Selection<?>... selections);
378390
<Y> JpaCompoundSelection<Y> array(Class<Y> resultClass, List<? extends JpaSelection<?>> selections);

hibernate-core/src/main/java/org/hibernate/query/criteria/JpaCriteriaQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
*
2626
* @author Steve Ebersole
2727
*/
28-
public interface JpaCriteriaQuery<T> extends CriteriaQuery<T>, JpaQueryableCriteria<T>, JpaSelectCriteria<T> {
28+
public interface JpaCriteriaQuery<T> extends CriteriaQuery<T>, JpaQueryableCriteria<T>, JpaSelectCriteria<T>, JpaCriteriaSelect<T> {
2929

3030
/**
3131
* A query that returns the number of results of this query.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
6+
*/
7+
package org.hibernate.query.criteria;
8+
9+
import jakarta.persistence.criteria.CriteriaSelect;
10+
11+
/**
12+
* Extension of the JPA {@link CriteriaSelect}.
13+
*
14+
* @apiNote This is different from {@link JpaSelectCriteria}. JPA added
15+
* {@link CriteriaSelect} in version 3.2 while {@link JpaSelectCriteria} has
16+
* existed for many releases prior. JPA's {@link CriteriaSelect} is intended
17+
* for supporting its newly added set operations (union, interest, except).
18+
*
19+
* @author Steve Ebersole
20+
*/
21+
public interface JpaCriteriaSelect<T> extends CriteriaSelect<T> {
22+
23+
}

0 commit comments

Comments
 (0)