Skip to content

Commit

Permalink
HHH-17377 - Migrate to JPA 3.2
Browse files Browse the repository at this point in the history
  • Loading branch information
sebersole committed Mar 28, 2024
1 parent 1581b56 commit 04ccabe
Show file tree
Hide file tree
Showing 22 changed files with 263 additions and 61 deletions.
4 changes: 0 additions & 4 deletions hibernate-core/hibernate-core.gradle
Expand Up @@ -10,10 +10,6 @@ plugins {
id 'org.hibernate.build.xjc-jakarta'
}

repositories {
gradlePluginPortal()
}

description = 'Hibernate\'s core ORM functionality'

apply from: rootProject.file( 'gradle/published-java-module.gradle' )
Expand Down
Expand Up @@ -20,7 +20,7 @@ public class ConfigurationEventReader extends AbstractEventReader {
public ConfigurationEventReader(XMLEventReader reader, XMLEventFactory xmlEventFactory) {
super(
ROOT_ELEMENT_NAME,
ConfigXsdSupport.configurationXsd(),
ConfigXsdSupport.getJPA32(),
reader,
xmlEventFactory
);
Expand Down
Expand Up @@ -72,6 +72,7 @@
import jakarta.persistence.RefreshOption;
import jakarta.persistence.criteria.CriteriaDelete;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.CriteriaSelect;
import jakarta.persistence.criteria.CriteriaUpdate;
import jakarta.persistence.metamodel.Metamodel;
import org.checkerframework.checker.nullness.qual.Nullable;
Expand Down Expand Up @@ -507,6 +508,11 @@ public RootGraphImplementor<?> getEntityGraph(String graphName) {
return delegate.getEntityGraph( graphName );
}

@Override
public <T> QueryImplementor<T> createQuery(CriteriaSelect<T> selectQuery) {
return delegate.createQuery( selectQuery );
}

@Override
public <T> List<EntityGraph<? super T>> getEntityGraphs(Class<T> entityClass) {
return delegate.getEntityGraphs( entityClass );
Expand Down
Expand Up @@ -17,11 +17,14 @@
import org.hibernate.event.spi.RefreshContext;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.query.spi.QueryImplementor;
import org.hibernate.resource.jdbc.spi.JdbcSessionOwner;
import org.hibernate.resource.transaction.spi.TransactionCoordinator;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder;
import org.hibernate.type.descriptor.WrapperOptions;

import jakarta.persistence.criteria.CriteriaSelect;

/**
* Defines the "internal contract" between {@link Session} and other parts of Hibernate
* including implementors of {@link org.hibernate.type.Type}, {@link EntityPersister},
Expand Down Expand Up @@ -77,6 +80,9 @@ default SessionImplementor getSession() {
@Override
RootGraphImplementor<?> getEntityGraph(String graphName);

@Override
<T> QueryImplementor<T> createQuery(CriteriaSelect<T> selectQuery);

/**
* Get the {@link ActionQueue} associated with this session.
*/
Expand Down
Expand Up @@ -53,8 +53,10 @@
import jakarta.persistence.LockModeType;
import jakarta.persistence.LockOption;
import jakarta.persistence.RefreshOption;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaDelete;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.CriteriaSelect;
import jakarta.persistence.criteria.CriteriaUpdate;
import jakarta.persistence.metamodel.Metamodel;
import org.checkerframework.checker.nullness.qual.Nullable;
Expand Down Expand Up @@ -591,6 +593,11 @@ public <R> Query<R> createQuery(CriteriaQuery<R> criteriaQuery) {
return this.lazySession.get().createQuery( criteriaQuery );
}

@Override
public <T> TypedQuery<T> createQuery(CriteriaSelect<T> selectQuery) {
return this.lazySession.get().createQuery( selectQuery );
}

@SuppressWarnings("rawtypes")
@Override
@Deprecated
Expand Down
Expand Up @@ -11,6 +11,7 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;

import org.hibernate.graph.AttributeNode;
import org.hibernate.graph.CannotBecomeEntityGraphException;
Expand Down Expand Up @@ -94,6 +95,42 @@ public void merge(GraphImplementor<? extends J> other) {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// AttributeNode handling


@Override
public <Y> AttributeNodeImplementor<Y> getAttributeNode(String attributeName) {
if ( attrNodeMap == null ) {
return null;
}
final PersistentAttribute<? super J, ?> attribute = managedType.findAttributeInSuperTypes( attributeName );
//noinspection unchecked
return (AttributeNodeImplementor<Y>) attrNodeMap.get( attribute );
}

@Override
public <Y> AttributeNodeImplementor<Y> getAttributeNode(Attribute<? super J, Y> attribute) {
return null;
}

@Override
public void visitAttributeNodes(Consumer<AttributeNodeImplementor<?>> consumer) {
if ( attrNodeMap == null ) {
return;
}
attrNodeMap.forEach( (persistentAttribute, attributeNodeImplementor) -> {
consumer.accept( attributeNodeImplementor );
} );
}

@Override
public List<AttributeNode<?>> getAttributeNodeList() {
if ( attrNodeMap == null ) {
return emptyList();
}
final List<AttributeNode<?>> result = new ArrayList<>();
visitAttributeNodes( result::add );
return result;
}

@Override
public AttributeNodeImplementor<?> addAttributeNode(AttributeNodeImplementor<?> incomingAttributeNode) {
verifyMutability();
Expand Down Expand Up @@ -147,8 +184,8 @@ public List<AttributeNodeImplementor<?>> getAttributeNodeImplementors() {
}

@Override
public void addAttributeNode(String attributeName) throws CannotContainSubGraphException {
findOrCreateAttributeNode( attributeName );
public <AJ> AttributeNodeImplementor<AJ> addAttributeNode(String attributeName) throws CannotContainSubGraphException {
return findOrCreateAttributeNode( attributeName );
}

@Override
Expand All @@ -158,8 +195,9 @@ public <AJ> AttributeNodeImplementor<AJ> addAttributeNode(PersistentAttribute<?
}

@Override
public void addAttributeNode(Attribute<? super J, ?> attribute) {
findOrCreateAttributeNode( (PersistentAttribute<? super J, ?>) attribute );
public <Y> AttributeNodeImplementor<Y> addAttributeNode(Attribute<? super J, Y> attribute) {
//noinspection unchecked
return (AttributeNodeImplementor<Y>) findOrCreateAttributeNode( (PersistentAttribute<? super J, ?>) attribute );
}

@Override
Expand Down
Expand Up @@ -15,6 +15,8 @@
import org.hibernate.graph.Graph;
import org.hibernate.metamodel.model.domain.PersistentAttribute;

import jakarta.persistence.metamodel.Attribute;

/**
* Integration version of the {@link Graph} contract
*
Expand Down Expand Up @@ -48,6 +50,16 @@ default void visitAttributeNodes(Consumer<AttributeNodeImplementor<?>> consumer)
getAttributeNodeImplementors().forEach( consumer );
}

@Override
default boolean hasAttributeNode(String attributeName) {
return getAttributeNode( attributeName ) != null;
}

@Override
default boolean hasAttributeNode(Attribute<? super J, ?> attribute) {
return getAttributeNode( attribute ) != null;
}

AttributeNodeImplementor<?> addAttributeNode(AttributeNodeImplementor<?> makeCopy);

List<AttributeNodeImplementor<?>> getAttributeNodeImplementors();
Expand All @@ -65,7 +77,10 @@ default List<AttributeNode<?>> getAttributeNodeList() {
<AJ> AttributeNodeImplementor<AJ> findAttributeNode(PersistentAttribute<? super J, AJ> attribute);

@Override
void addAttributeNode(String attributeName) throws CannotContainSubGraphException;
<AJ> AttributeNodeImplementor<AJ> addAttributeNode(String attributeName) throws CannotContainSubGraphException;

@Override
<Y> AttributeNodeImplementor<Y> addAttributeNode(Attribute<? super J, Y> attribute);

@Override
<AJ> AttributeNodeImplementor<AJ> addAttributeNode(PersistentAttribute<? super J, AJ> attribute)
Expand Down
Expand Up @@ -831,6 +831,7 @@ public <R> SelectionQuery<R> createSelectionQuery(String hqlString, Class<R> exp
return interpretAndCreateSelectionQuery( hqlString, expectedResultType );
}


@Override
public <R> SelectionQuery<R> createSelectionQuery(CriteriaQuery<R> criteria) {
if ( criteria instanceof CriteriaDefinition ) {
Expand Down Expand Up @@ -1447,7 +1448,7 @@ public QueryImplementor createQuery(@SuppressWarnings("rawtypes") CriteriaDelete
}
}

private <T> QueryImplementor<T> createCriteriaQuery(SqmStatement<T> criteria, Class<T> resultType) {
protected <T> QueryImplementor<T> createCriteriaQuery(SqmStatement<T> criteria, Class<T> resultType) {
final QuerySqmImpl<T> query = new QuerySqmImpl<>( criteria, resultType, this );
applyQuerySettingsAndHints( query );
return query;
Expand Down
Expand Up @@ -124,6 +124,11 @@
import org.hibernate.query.Query;
import org.hibernate.query.SelectionQuery;
import org.hibernate.query.UnknownSqlResultSetMappingException;
import org.hibernate.query.criteria.CriteriaDefinition;
import org.hibernate.query.spi.QueryImplementor;
import org.hibernate.query.sqm.tree.select.SqmQueryGroup;
import org.hibernate.query.sqm.tree.select.SqmQuerySpec;
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
import org.hibernate.resource.jdbc.spi.JdbcSessionOwner;
import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode;
import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl;
Expand All @@ -147,6 +152,7 @@
import jakarta.persistence.PersistenceException;
import jakarta.persistence.RefreshOption;
import jakarta.persistence.TransactionRequiredException;
import jakarta.persistence.criteria.CriteriaSelect;
import jakarta.persistence.metamodel.Metamodel;

import static java.lang.Boolean.parseBoolean;
Expand Down Expand Up @@ -1718,6 +1724,35 @@ public SessionFactoryImplementor getSessionFactory() {
return getFactory();
}

@Override
public <T> QueryImplementor<T> createQuery(CriteriaSelect<T> selectQuery) {
checkOpen();
if ( selectQuery instanceof CriteriaDefinition ) {
return (QueryImplementor<T>) ((CriteriaDefinition<T>) selectQuery).createSelectionQuery(this);
}
else {
try {
final SqmSelectStatement<T> selectStatement = (SqmSelectStatement<T>) selectQuery;
if ( ! ( selectStatement.getQueryPart() instanceof SqmQueryGroup ) ) {
final SqmQuerySpec<T> querySpec = selectStatement.getQuerySpec();
if ( querySpec.getSelectClause().getSelections().isEmpty() ) {
if ( querySpec.getFromClause().getRoots().size() == 1 ) {
querySpec.getSelectClause().setSelection( querySpec.getFromClause().getRoots().get(0) );
}
}
}

return createCriteriaQuery( selectStatement, selectStatement.getResultType() );
}
catch (RuntimeException e) {
if ( getSessionFactory().getJpaMetamodel().getJpaCompliance().isJpaTransactionComplianceEnabled() ) {
markForRollbackOnly();
}
throw getExceptionConverter().convert( e );
}
}
}

@Override
public void initializeCollection(PersistentCollection<?> collection, boolean writing) {
checkOpenOrWaitingForAutoClose();
Expand Down
Expand Up @@ -166,8 +166,7 @@ public interface QueryProducer {
*
* @apiNote Changes in JPA 3.2 required de-typing this to be compilable with their changes
*/
@SuppressWarnings("rawtypes")
NativeQuery createNativeQuery(String sqlString, Class<?> resultClass);
<R> NativeQuery<R> createNativeQuery(String sqlString, Class<R> resultClass);

/**
* Create a {@link NativeQuery} instance for the given native SQL query
Expand Down
Expand Up @@ -24,17 +24,15 @@
import org.hibernate.query.NullPrecedence;
import org.hibernate.query.SortDirection;
import org.hibernate.query.sqm.FrameKind;
import org.hibernate.query.sqm.SetOperator;
import org.hibernate.query.sqm.SqmQuerySource;
import org.hibernate.query.sqm.TemporalUnit;
import org.hibernate.query.sqm.tree.select.SqmQueryGroup;
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;

import jakarta.persistence.Tuple;
import jakarta.persistence.criteria.AbstractQuery;
import jakarta.persistence.criteria.CollectionJoin;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.CriteriaSelect;
import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.ListJoin;
Expand Down Expand Up @@ -180,15 +178,10 @@ default <T> JpaCriteriaQuery<T> except(CriteriaQuery<? extends T> query1, Criter

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

default <T> JpaSubQuery<T> unionAll(Subquery<? extends T> query1, Subquery<?>... queries) {
return union( true, query1, queries );
}

@Override
<T> JpaCriteriaQuery<T> union(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right);
<T> CriteriaSelect<T> union(CriteriaSelect<? extends T> left, CriteriaSelect<? extends T> right);

@Override
<T> JpaCriteriaQuery<T> unionAll(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right);
<T> JpaCriteriaQuery<T> union(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right);

default <T> JpaSubQuery<T> union(Subquery<? extends T> query1, Subquery<?>... queries) {
return union( false, query1, queries );
Expand All @@ -199,10 +192,23 @@ default <T> JpaSubQuery<T> union(boolean all, Subquery<? extends T> query1, Subq
return null;
}

default <T> JpaSubQuery<T> unionAll(Subquery<? extends T> query1, Subquery<?>... queries) {
return union( true, query1, queries );
}

@Override
<T> JpaCriteriaQuery<T> intersect(CriteriaQuery<? super T> left, CriteriaQuery<? super T> right);
<T> CriteriaSelect<T> unionAll(CriteriaSelect<? extends T> left, CriteriaSelect<? extends T> right);

<T> JpaCriteriaQuery<T> unionAll(CriteriaQuery<? extends T> left, CriteriaQuery<? extends T> right);

@Override
<T> CriteriaSelect<T> intersect(CriteriaSelect<? super T> left, CriteriaSelect<? super T> right);

@Override
<T> CriteriaSelect<T> intersectAll(CriteriaSelect<? super T> left, CriteriaSelect<? super T> right);

<T> JpaCriteriaQuery<T> intersect(CriteriaQuery<? super T> left, CriteriaQuery<? super T> right);

<T> JpaCriteriaQuery<T> intersectAll(CriteriaQuery<? super T> left, CriteriaQuery<? super T> right);

default <T> JpaSubQuery<T> intersectAll(Subquery<? extends T> query1, Subquery<?>... queries) {
Expand All @@ -216,9 +222,13 @@ default <T> JpaSubQuery<T> intersect(Subquery<? extends T> query1, Subquery<?>..
<T> JpaSubQuery<T> intersect(boolean all, Subquery<? extends T> query1, Subquery<?>... queries);

@Override
<T> JpaCriteriaQuery<T> except(CriteriaQuery<T> left, CriteriaQuery<?> right);
<T> CriteriaSelect<T> except(CriteriaSelect<T> left, CriteriaSelect<?> right);

@Override
<T> CriteriaSelect<T> exceptAll(CriteriaSelect<T> left, CriteriaSelect<?> right);

<T> JpaCriteriaQuery<T> except(CriteriaQuery<T> left, CriteriaQuery<?> right);

<T> JpaCriteriaQuery<T> exceptAll(CriteriaQuery<T> left, CriteriaQuery<?> right);

default <T> JpaSubQuery<T> exceptAll(Subquery<? extends T> query1, Subquery<?>... queries) {
Expand Down Expand Up @@ -373,11 +383,11 @@ default <T> JpaSubQuery<T> except(Subquery<? extends T> query1, Subquery<?>... q

@Override
JpaCompoundSelection<Tuple> tuple(Selection<?>... selections);
JpaCompoundSelection<Tuple> tuple(List<? extends JpaSelection<?>> selections);
JpaCompoundSelection<Tuple> tuple(List<Selection<?>> selections);

@Override
JpaCompoundSelection<Object[]> array(Selection<?>... selections);
JpaCompoundSelection<Object[]> array(List<? extends JpaSelection<?>> selections);
JpaCompoundSelection<Object[]> array(List<Selection<?>> selections);

<Y> JpaCompoundSelection<Y> array(Class<Y> resultClass, Selection<?>... selections);
<Y> JpaCompoundSelection<Y> array(Class<Y> resultClass, List<? extends JpaSelection<?>> selections);
Expand Down
Expand Up @@ -25,7 +25,7 @@
*
* @author Steve Ebersole
*/
public interface JpaCriteriaQuery<T> extends CriteriaQuery<T>, JpaQueryableCriteria<T>, JpaSelectCriteria<T> {
public interface JpaCriteriaQuery<T> extends CriteriaQuery<T>, JpaQueryableCriteria<T>, JpaSelectCriteria<T>, JpaCriteriaSelect<T> {

/**
* A query that returns the number of results of this query.
Expand Down

0 comments on commit 04ccabe

Please sign in to comment.