diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java index 2f0c162936..dc9573b5c4 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java @@ -15,17 +15,6 @@ */ package org.springframework.data.jpa.convert; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.Expression; -import jakarta.persistence.criteria.From; -import jakarta.persistence.criteria.Path; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; -import jakarta.persistence.metamodel.Attribute; -import jakarta.persistence.metamodel.Attribute.PersistentAttributeType; -import jakarta.persistence.metamodel.ManagedType; -import jakarta.persistence.metamodel.SingularAttribute; - import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -45,6 +34,17 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.From; +import jakarta.persistence.criteria.Path; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; +import jakarta.persistence.metamodel.Attribute; +import jakarta.persistence.metamodel.Attribute.PersistentAttributeType; +import jakarta.persistence.metamodel.ManagedType; +import jakarta.persistence.metamodel.SingularAttribute; + /** * {@link QueryByExamplePredicateBuilder} creates a single {@link CriteriaBuilder#and(Predicate...)} combined * {@link Predicate} for a given {@link Example}.
@@ -57,6 +57,7 @@ * @author Oliver Gierke * @author Jens Schauder * @author Greg Turnquist + * @author Christian Wörz * @since 1.10 */ public class QueryByExamplePredicateBuilder { @@ -186,35 +187,24 @@ static List getPredicates(String path, CriteriaBuilder cb, Path fr } switch (exampleAccessor.getStringMatcherForPath(currentPath)) { - - case DEFAULT: - case EXACT: - predicates.add(cb.equal(expression, attributeValue)); - break; - case CONTAINING: - predicates.add(cb.like( // - expression, // - "%" + escapeCharacter.escape(attributeValue.toString()) + "%", // - escapeCharacter.getEscapeCharacter() // + case DEFAULT, EXACT -> predicates.add(cb.equal(expression, attributeValue)); + case CONTAINING -> predicates.add(cb.like( // + expression, // + "%" + escapeCharacter.escape(attributeValue.toString()) + "%", // + escapeCharacter.getEscapeCharacter() // )); - break; - case STARTING: - predicates.add(cb.like(// - expression, // - escapeCharacter.escape(attributeValue.toString()) + "%", // - escapeCharacter.getEscapeCharacter()) // + case STARTING -> predicates.add(cb.like(// + expression, // + escapeCharacter.escape(attributeValue.toString()) + "%", // + escapeCharacter.getEscapeCharacter()) // ); - break; - case ENDING: - predicates.add(cb.like( // - expression, // - "%" + escapeCharacter.escape(attributeValue.toString()), // - escapeCharacter.getEscapeCharacter()) // + case ENDING -> predicates.add(cb.like( // + expression, // + "%" + escapeCharacter.escape(attributeValue.toString()), // + escapeCharacter.getEscapeCharacter()) // ); - break; - default: - throw new IllegalArgumentException( - "Unsupported StringMatcher " + exampleAccessor.getStringMatcherForPath(currentPath)); + default -> throw new IllegalArgumentException( + "Unsupported StringMatcher " + exampleAccessor.getStringMatcherForPath(currentPath)); } } else { predicates.add(cb.equal(from.get(attribute), attributeValue)); diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/JpaSort.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/JpaSort.java index 629e743cfe..1f147dd079 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/JpaSort.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/JpaSort.java @@ -15,9 +15,6 @@ */ package org.springframework.data.jpa.domain; -import jakarta.persistence.metamodel.Attribute; -import jakarta.persistence.metamodel.PluralAttribute; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -28,11 +25,8 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import jakarta.persistence.metamodel.Attribute; +import jakarta.persistence.metamodel.PluralAttribute; /** * Sort option for queries that wraps JPA meta-model {@link Attribute}s for sorting. @@ -42,13 +36,14 @@ * @author Christoph Strobl * @author David Madden * @author Jens Schauder + * @author Christian Wörz */ public class JpaSort extends Sort { private static final long serialVersionUID = 1L; private JpaSort(Direction direction, List> paths) { - this(Collections.emptyList(), direction, paths); + this(Collections. emptyList(), direction, paths); } private JpaSort(List orders, @Nullable Direction direction, List> paths) { @@ -80,7 +75,7 @@ public static JpaSort of(JpaSort.Path... paths) { /** * Creates a new {@link JpaSort} for the given direction and attributes. * - * @param direction the sorting direction. + * @param direction the sorting direction. * @param attributes must not be {@literal null} or empty. */ public static JpaSort of(Direction direction, Attribute... attributes) { @@ -91,7 +86,7 @@ public static JpaSort of(Direction direction, Attribute... attributes) { * Creates a new {@link JpaSort} for the given direction and {@link Path}s. * * @param direction the sorting direction. - * @param paths must not be {@literal null} or empty. + * @param paths must not be {@literal null} or empty. */ public static JpaSort of(Direction direction, Path... paths) { return new JpaSort(direction, Arrays.asList(paths)); @@ -100,7 +95,7 @@ public static JpaSort of(Direction direction, Path... paths) { /** * Returns a new {@link JpaSort} with the given sorting criteria added to the current one. * - * @param direction can be {@literal null}. + * @param direction can be {@literal null}. * @param attributes must not be {@literal null}. * @return */ @@ -115,7 +110,7 @@ public JpaSort and(@Nullable Direction direction, Attribute... attributes) * Returns a new {@link JpaSort} with the given sorting criteria added to the current one. * * @param direction can be {@literal null}. - * @param paths must not be {@literal null}. + * @param paths must not be {@literal null}. * @return */ public JpaSort and(@Nullable Direction direction, Path... paths) { @@ -134,7 +129,7 @@ public JpaSort and(@Nullable Direction direction, Path... paths) { /** * Returns a new {@link JpaSort} with the given sorting criteria added to the current one. * - * @param direction can be {@literal null}. + * @param direction can be {@literal null}. * @param properties must not be {@literal null} or empty. * @return */ @@ -152,7 +147,7 @@ public JpaSort andUnsafe(@Nullable Direction direction, String... properties) { orders.add(new JpaOrder(direction, property)); } - return new JpaSort(orders, direction, Collections.>emptyList()); + return new JpaSort(orders, direction, Collections.> emptyList()); } /** @@ -223,7 +218,7 @@ public static JpaSort unsafe(String... properties) { /** * Creates new unsafe {@link JpaSort} based on given {@link Direction} and properties. * - * @param direction must not be {@literal null}. + * @param direction must not be {@literal null}. * @param properties must not be {@literal null} or empty. * @return */ @@ -239,7 +234,7 @@ public static JpaSort unsafe(Direction direction, String... properties) { /** * Creates new unsafe {@link JpaSort} based on given {@link Direction} and properties. * - * @param direction must not be {@literal null}. + * @param direction must not be {@literal null}. * @param properties must not be {@literal null} or empty. * @return */ @@ -286,14 +281,14 @@ public , U> Path dot(A attribute) { * @return */ public

, U> Path dot(P attribute) { - return new Path(add(attribute)); + return new Path<>(add(attribute)); } private List> add(Attribute attribute) { Assert.notNull(attribute, "Attribute must not be null"); - List> newAttributes = new ArrayList>(attributes.size() + 1); + List> newAttributes = new ArrayList<>(attributes.size() + 1); newAttributes.addAll(attributes); newAttributes.add(attribute); return newAttributes; @@ -331,7 +326,7 @@ public static class JpaOrder extends Order { * {@link Sort#DEFAULT_DIRECTION} * * @param direction can be {@literal null}, will default to {@link Sort#DEFAULT_DIRECTION}. - * @param property must not be {@literal null}. + * @param property must not be {@literal null}. */ private JpaOrder(@Nullable Direction direction, String property) { this(direction, property, NullHandling.NATIVE); @@ -341,8 +336,8 @@ private JpaOrder(@Nullable Direction direction, String property) { * Creates a new {@link Order} instance. if order is {@literal null} then order defaults to * {@link Sort#DEFAULT_DIRECTION}. * - * @param direction can be {@literal null}, will default to {@link Sort#DEFAULT_DIRECTION}. - * @param property must not be {@literal null}. + * @param direction can be {@literal null}, will default to {@link Sort#DEFAULT_DIRECTION}. + * @param property must not be {@literal null}. * @param nullHandlingHint can be {@literal null}, will default to {@link NullHandling#NATIVE}. */ private JpaOrder(@Nullable Direction direction, String property, NullHandling nullHandlingHint) { @@ -350,7 +345,7 @@ private JpaOrder(@Nullable Direction direction, String property, NullHandling nu } private JpaOrder(@Nullable Direction direction, String property, boolean ignoreCase, NullHandling nullHandling, - boolean unsafe) { + boolean unsafe) { super(direction, property, ignoreCase, nullHandling); this.unsafe = unsafe; diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java index a5b39ef017..d28031b76d 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/domain/Specification.java @@ -15,18 +15,17 @@ */ package org.springframework.data.jpa.domain; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaDelete; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; - import java.io.Serializable; import java.util.Arrays; import java.util.stream.StreamSupport; import org.springframework.lang.Nullable; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; + /** * Specification in the sense of Domain Driven Design. * @@ -37,6 +36,7 @@ * @author Mark Paluch * @author Jens Schauder * @author Daniel Shuy + * @author Christian Wörz */ public interface Specification extends Serializable { diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/mapping/JpaPersistentPropertyImpl.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/mapping/JpaPersistentPropertyImpl.java index 6f0773974f..15cfc705dc 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/mapping/JpaPersistentPropertyImpl.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/mapping/JpaPersistentPropertyImpl.java @@ -15,13 +15,9 @@ */ package org.springframework.data.jpa.mapping; -import jakarta.persistence.*; -import jakarta.persistence.metamodel.Metamodel; - import java.lang.annotation.Annotation; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.Set; import org.springframework.core.annotation.AnnotationUtils; @@ -37,6 +33,9 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import jakarta.persistence.*; +import jakarta.persistence.metamodel.Metamodel; + /** * {@link JpaPersistentProperty} implementation using a JPA {@link Metamodel}. * @@ -46,38 +45,17 @@ * @author Christoph Strobl * @author Mark Paluch * @author Erik Pellizzon + * @author Christian Wörz * @since 1.3 */ class JpaPersistentPropertyImpl extends AnnotationBasedPersistentProperty implements JpaPersistentProperty { - private static final Collection> ASSOCIATION_ANNOTATIONS; - private static final Collection> ID_ANNOTATIONS; - private static final Collection> UPDATEABLE_ANNOTATIONS; - - static { - - Set> annotations = new HashSet<>(); - annotations.add(OneToMany.class); - annotations.add(OneToOne.class); - annotations.add(ManyToMany.class); - annotations.add(ManyToOne.class); - - ASSOCIATION_ANNOTATIONS = Collections.unmodifiableSet(annotations); - - annotations = new HashSet<>(); - annotations.add(Id.class); - annotations.add(EmbeddedId.class); - - ID_ANNOTATIONS = Collections.unmodifiableSet(annotations); - - annotations = new HashSet<>(); - annotations.add(Column.class); - annotations.add(OrderColumn.class); - - UPDATEABLE_ANNOTATIONS = Collections.unmodifiableSet(annotations); - } - + private static final Collection> ASSOCIATION_ANNOTATIONS = Set.of(OneToMany.class, + OneToOne.class, ManyToMany.class, ManyToOne.class); + private static final Collection> ID_ANNOTATIONS = Set.of(Id.class, EmbeddedId.class); + private static final Collection> UPDATEABLE_ANNOTATIONS = Set.of(Column.class, + OrderColumn.class); private final @Nullable Boolean usePropertyAccess; private final @Nullable TypeInformation associationTargetType; private final boolean updateable; @@ -107,7 +85,7 @@ public JpaPersistentPropertyImpl(JpaMetamodel metamodel, Property property, this.associationTargetType = detectAssociationTargetType(); this.updateable = detectUpdatability(); - this.isIdProperty = Lazy.of(() -> ID_ANNOTATIONS.stream().anyMatch(it -> isAnnotationPresent(it)) // + this.isIdProperty = Lazy.of(() -> ID_ANNOTATIONS.stream().anyMatch(this::isAnnotationPresent) // || metamodel.isSingleIdAttribute(getOwner().getType(), getName(), getType())); this.isEntity = Lazy.of(() -> metamodel.isMappedType(getActualType())); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/EntityGraph.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/EntityGraph.java index 79de53344b..f96ef8fe2e 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/EntityGraph.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/EntityGraph.java @@ -24,16 +24,15 @@ import org.springframework.data.jpa.repository.query.JpaQueryMethod; /** - * Annotation to configure the JPA 2.1 {@link jakarta.persistence.EntityGraph}s that should be used on repository methods. - * Since 1.9 we support the definition of dynamic {@link EntityGraph}s by allowing to customize the fetch-graph via - * {@link #attributePaths()} ad-hoc fetch-graph configuration. - * - * If {@link #attributePaths()} are specified then we ignore the entity-graph name {@link #value()} and treat this - * {@link EntityGraph} as dynamic. + * Annotation to configure the JPA 2.1 {@link jakarta.persistence.EntityGraph}s that should be used on repository + * methods. Since 1.9 we support the definition of dynamic {@link EntityGraph}s by allowing to customize the fetch-graph + * via {@link #attributePaths()} ad-hoc fetch-graph configuration. If {@link #attributePaths()} are specified then we + * ignore the entity-graph name {@link #value()} and treat this {@link EntityGraph} as dynamic. * * @author Christoph Strobl * @author Thomas Darimont * @author Oerd Cukalla + * @author Christian Wörz * @since 1.6 */ @Retention(RetentionPolicy.RUNTIME) @@ -71,7 +70,7 @@ * @author Thomas Darimont * @since 1.6 */ - public enum EntityGraphType { + enum EntityGraphType { /** * When the jakarta.persistence.loadgraph property is used to specify an entity graph, attributes that are specified @@ -84,9 +83,9 @@ public enum EntityGraphType { LOAD("jakarta.persistence.loadgraph"), /** - * When the jakarta.persistence.fetchgraph property is used to specify an entity graph, attributes that are specified - * by attribute nodes of the entity graph are treated as FetchType.EAGER and attributes that are not specified are - * treated as FetchType.LAZY + * When the jakarta.persistence.fetchgraph property is used to specify an entity graph, attributes that are + * specified by attribute nodes of the entity graph are treated as FetchType.EAGER and attributes that are not + * specified are treated as FetchType.LAZY * * @see JPA 2.1 * Specification: 3.7.4.1 Fetch Graph Semantics @@ -95,7 +94,7 @@ public enum EntityGraphType { private final String key; - private EntityGraphType(String value) { + EntityGraphType(String value) { this.key = value; } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRuntimeHints.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRuntimeHints.java index d097bfcae8..4a44905282 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRuntimeHints.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRuntimeHints.java @@ -15,8 +15,6 @@ */ package org.springframework.data.jpa.repository.aot; -import jakarta.persistence.NamedEntityGraph; - import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -39,10 +37,13 @@ import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; +import jakarta.persistence.NamedEntityGraph; + /** * Runtime hints for JPA AOT processing. * * @author Christoph Strobl + * @author Christian Wörz * @since 3.0 */ class JpaRuntimeHints implements RuntimeHintsRegistrar { @@ -88,9 +89,8 @@ public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) // streaming results requires reflective access to jakarta.persistence.Query#getResultAsStream hints.reflection().registerType(jakarta.persistence.Query.class, MemberCategory.INTROSPECT_PUBLIC_METHODS); - hints.reflection().registerType(jakarta.persistence.Query.class, hint -> { - hint.withMethod("getResultStream", Collections.emptyList(), ExecutableMode.INVOKE); - }); + hints.reflection().registerType(jakarta.persistence.Query.class, + hint -> hint.withMethod("getResultStream", Collections.emptyList(), ExecutableMode.INVOKE)); hints.reflection().registerType(NamedEntityGraph.class, hint -> hint.onReachableType(EntityGraph.class).withMembers(MemberCategory.INVOKE_PUBLIC_METHODS)); diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java index a6d1e18d9b..f46c56378e 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java @@ -27,6 +27,7 @@ * * @author Jens Schauder * @author Oliver Drotbohm + * @author Christian Wörz */ public final class EscapeCharacter { @@ -69,11 +70,10 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof EscapeCharacter)) { + if (!(o instanceof EscapeCharacter that)) { return false; } - EscapeCharacter that = (EscapeCharacter) o; return escapeCharacter == that.escapeCharacter; } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java index e705664a7f..a9f15ac790 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java @@ -24,6 +24,7 @@ * An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that renders an HQL query without making any changes. * * @author Greg Turnquist + * @author Christian Wörz * @since 3.1 */ class HqlQueryRenderer extends HqlBaseVisitor> { @@ -341,9 +342,7 @@ public List visitEntityWithJoins(HqlParser.EntityWithJoins tokens.addAll(visit(ctx.fromRoot())); SPACE(tokens); - ctx.joinSpecifier().forEach(joinSpecifierContext -> { - tokens.addAll(visit(joinSpecifierContext)); - }); + ctx.joinSpecifier().forEach(joinSpecifierContext -> tokens.addAll(visit(joinSpecifierContext))); return tokens; } @@ -1455,9 +1454,8 @@ public List visitSimpleCaseExpression(HqlParser.SimpleCase tokens.add(new JpaQueryParsingToken(ctx.CASE())); tokens.addAll(visit(ctx.expressionOrPredicate(0))); - ctx.caseWhenExpressionClause().forEach(caseWhenExpressionClauseContext -> { - tokens.addAll(visit(caseWhenExpressionClauseContext)); - }); + ctx.caseWhenExpressionClause() + .forEach(caseWhenExpressionClauseContext -> tokens.addAll(visit(caseWhenExpressionClauseContext))); if (ctx.ELSE() != null) { @@ -1477,9 +1475,8 @@ public List visitSearchedCaseExpression(HqlParser.Searched tokens.add(new JpaQueryParsingToken(ctx.CASE())); - ctx.caseWhenPredicateClause().forEach(caseWhenPredicateClauseContext -> { - tokens.addAll(visit(caseWhenPredicateClauseContext)); - }); + ctx.caseWhenPredicateClause() + .forEach(caseWhenPredicateClauseContext -> tokens.addAll(visit(caseWhenPredicateClauseContext))); if (ctx.ELSE() != null) { diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java index 03a92fed5e..44057d0ba9 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java @@ -18,6 +18,20 @@ import static org.springframework.data.jpa.repository.query.JSqlParserUtils.*; import static org.springframework.data.jpa.repository.query.QueryUtils.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.data.domain.Sort; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.Expression; @@ -39,26 +53,13 @@ import net.sf.jsqlparser.statement.update.Update; import net.sf.jsqlparser.statement.values.ValuesStatement; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.data.domain.Sort; -import org.springframework.lang.Nullable; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - /** * The implementation of {@link QueryEnhancer} using JSqlParser. * * @author Diego Krupitza * @author Greg Turnquist * @author Geoffrey Deremetz + * @author Christian Wörz * @since 2.7.0 */ public class JSqlParserQueryEnhancer implements QueryEnhancer { @@ -120,7 +121,7 @@ public String applySorting(Sort sort, @Nullable String alias) { Select selectStatement = parseSelectStatement(queryString); - if (selectStatement.getSelectBody()instanceof SetOperationList setOperationList) { + if (selectStatement.getSelectBody() instanceof SetOperationList setOperationList) { return applySortingToSetOperationList(setOperationList, sort); } else if (!(selectStatement.getSelectBody() instanceof PlainSelect)) { return queryString; @@ -221,7 +222,7 @@ private Set getJoinAliases(String query) { } Select selectStatement = (Select) statement; - if (selectStatement.getSelectBody()instanceof PlainSelect selectBody) { + if (selectStatement.getSelectBody() instanceof PlainSelect selectBody) { return getJoinAliases(selectBody); } @@ -319,7 +320,7 @@ private String detectAlias(String query) { * ValuesStatement has no alias * SetOperation can have multiple alias for each operation item */ - if (!(selectStatement.getSelectBody()instanceof PlainSelect selectBody)) { + if (!(selectStatement.getSelectBody() instanceof PlainSelect selectBody)) { return null; } @@ -374,7 +375,7 @@ public String createCountQueryFor(@Nullable String countProjection) { /* We only support count queries for {@link PlainSelect}. */ - if (!(selectStatement.getSelectBody()instanceof PlainSelect selectBody)) { + if (!(selectStatement.getSelectBody() instanceof PlainSelect selectBody)) { return this.query.getQueryString(); } @@ -441,7 +442,7 @@ public String getProjection() { SelectBody selectBody = selectStatement.getSelectBody(); - if (selectStatement.getSelectBody()instanceof SetOperationList setOperationList) { + if (selectStatement.getSelectBody() instanceof SetOperationList setOperationList) { // using the first one since for setoperations the projection has to be the same selectBody = setOperationList.getSelects().get(0); @@ -517,7 +518,7 @@ public DeclaredQuery getQuery() { * */ enum ParsedType { - DELETE, UPDATE, SELECT, INSERT, MERGE, OTHER; + DELETE, UPDATE, SELECT, INSERT, MERGE, OTHER } } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java index 0d4bda7faa..e6a635b044 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java @@ -15,17 +15,17 @@ */ package org.springframework.data.jpa.repository.query; +import org.springframework.data.domain.Sort; +import org.springframework.data.repository.query.ReturnedType; +import org.springframework.data.repository.query.parser.PartTree; +import org.springframework.lang.Nullable; + import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import org.springframework.data.domain.Sort; -import org.springframework.data.repository.query.ReturnedType; -import org.springframework.data.repository.query.parser.PartTree; -import org.springframework.lang.Nullable; - /** * Special {@link JpaQueryCreator} that creates a count projecting query. * @@ -33,6 +33,7 @@ * @author Marc Lefrançois * @author Mark Paluch * @author Greg Turnquist + * @author Christian Wörz */ public class JpaCountQueryCreator extends JpaQueryCreator { @@ -55,17 +56,17 @@ public JpaCountQueryCreator(PartTree tree, ReturnedType type, CriteriaBuilder bu } @Override - protected CriteriaQuery createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { + protected CriteriaQuery createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { return builder.createQuery(Long.class); } @Override @SuppressWarnings("unchecked") - protected CriteriaQuery complete(@Nullable Predicate predicate, Sort sort, - CriteriaQuery query, CriteriaBuilder builder, Root root) { + protected CriteriaQuery complete(@Nullable Predicate predicate, Sort sort, CriteriaQuery query, + CriteriaBuilder builder, Root root) { - CriteriaQuery select = query.select(getCountQuery(query, builder, root)); + CriteriaQuery select = query.select(getCountQuery(query, builder, root)); return predicate == null ? select : select.where(predicate); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java index 431d1b7111..b3852e3f6d 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java @@ -18,16 +18,6 @@ import static org.springframework.data.jpa.repository.query.QueryUtils.*; import static org.springframework.data.repository.query.parser.Part.Type.*; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Expression; -import jakarta.persistence.criteria.ParameterExpression; -import jakarta.persistence.criteria.Path; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; -import jakarta.persistence.criteria.Selection; -import jakarta.persistence.metamodel.SingularAttribute; - import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -45,6 +35,16 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.ParameterExpression; +import jakarta.persistence.criteria.Path; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.Selection; +import jakarta.persistence.metamodel.SingularAttribute; + /** * Query creator to create a {@link CriteriaQuery} from a {@link PartTree}. * @@ -56,12 +56,13 @@ * @author Moritz Becker * @author Andrey Kovalev * @author Greg Turnquist + * @author Christian Wörz */ -public class JpaQueryCreator extends AbstractQueryCreator, Predicate> { +public class JpaQueryCreator extends AbstractQueryCreator, Predicate> { private final CriteriaBuilder builder; private final Root root; - private final CriteriaQuery query; + private final CriteriaQuery query; private final ParameterMetadataProvider provider; private final ReturnedType returnedType; private final PartTree tree; @@ -98,7 +99,7 @@ public JpaQueryCreator(PartTree tree, ReturnedType type, CriteriaBuilder builder * @param type will never be {@literal null}. * @return must not be {@literal null}. */ - protected CriteriaQuery createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { + protected CriteriaQuery createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { Class typeToRead = tree.isDelete() ? type.getDomainType() : type.getTypeToRead(); @@ -137,7 +138,7 @@ protected Predicate or(Predicate base, Predicate predicate) { * {@link CriteriaQuery} and {@link CriteriaBuilder}. */ @Override - protected final CriteriaQuery complete(Predicate predicate, Sort sort) { + protected final CriteriaQuery complete(Predicate predicate, Sort sort) { return complete(predicate, sort, query, builder, root); } @@ -152,8 +153,8 @@ protected final CriteriaQuery complete(Predicate predicate, So * @return */ @SuppressWarnings({ "unchecked", "rawtypes" }) - protected CriteriaQuery complete(@Nullable Predicate predicate, Sort sort, - CriteriaQuery query, CriteriaBuilder builder, Root root) { + protected CriteriaQuery complete(@Nullable Predicate predicate, Sort sort, CriteriaQuery query, + CriteriaBuilder builder, Root root) { if (returnedType.needsCustomConstruction()) { @@ -191,7 +192,7 @@ protected CriteriaQuery complete(@Nullable Predicate predicate query = query.select((Root) root); } - CriteriaQuery select = query.orderBy(QueryUtils.toOrders(sort, root, builder)); + CriteriaQuery select = query.orderBy(QueryUtils.toOrders(sort, root, builder)); return predicate == null ? select : select.where(predicate); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java index 8083f49979..97981cb60f 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java @@ -15,8 +15,6 @@ */ package org.springframework.data.jpa.repository.query; -import jakarta.persistence.EntityManager; - import java.lang.reflect.Method; import org.apache.commons.logging.Log; @@ -35,6 +33,8 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import jakarta.persistence.EntityManager; + /** * Query lookup strategy to execute finders. * @@ -43,6 +43,7 @@ * @author Mark Paluch * @author Réda Housni Alaoui * @author Greg Turnquist + * @author Christian Wörz */ public final class JpaQueryLookupStrategy { @@ -275,20 +276,16 @@ public static QueryLookupStrategy create(EntityManager em, JpaQueryMethodFactory Assert.notNull(em, "EntityManager must not be null"); Assert.notNull(evaluationContextProvider, "EvaluationContextProvider must not be null"); - switch (key != null ? key : Key.CREATE_IF_NOT_FOUND) { - case CREATE: - return new CreateQueryLookupStrategy(em, queryMethodFactory, queryRewriterProvider, escape); - case USE_DECLARED_QUERY: - return new DeclaredQueryLookupStrategy(em, queryMethodFactory, evaluationContextProvider, - queryRewriterProvider); - case CREATE_IF_NOT_FOUND: - return new CreateIfNotFoundQueryLookupStrategy(em, queryMethodFactory, - new CreateQueryLookupStrategy(em, queryMethodFactory, queryRewriterProvider, escape), - new DeclaredQueryLookupStrategy(em, queryMethodFactory, evaluationContextProvider, queryRewriterProvider), - queryRewriterProvider); - default: - throw new IllegalArgumentException(String.format("Unsupported query lookup strategy %s", key)); - } + return switch (key != null ? key : Key.CREATE_IF_NOT_FOUND) { + case CREATE -> new CreateQueryLookupStrategy(em, queryMethodFactory, queryRewriterProvider, escape); + case USE_DECLARED_QUERY -> + new DeclaredQueryLookupStrategy(em, queryMethodFactory, evaluationContextProvider, queryRewriterProvider); + case CREATE_IF_NOT_FOUND -> new CreateIfNotFoundQueryLookupStrategy(em, queryMethodFactory, + new CreateQueryLookupStrategy(em, queryMethodFactory, queryRewriterProvider, escape), + new DeclaredQueryLookupStrategy(em, queryMethodFactory, evaluationContextProvider, queryRewriterProvider), + queryRewriterProvider); + default -> throw new IllegalArgumentException(String.format("Unsupported query lookup strategy %s", key)); + }; } /** diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java index ed566ba52c..2e22df8f58 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryMethod.java @@ -15,14 +15,10 @@ */ package org.springframework.data.jpa.repository.query; -import jakarta.persistence.LockModeType; -import jakarta.persistence.QueryHint; - import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -51,6 +47,9 @@ import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.StringUtils; +import jakarta.persistence.LockModeType; +import jakarta.persistence.QueryHint; + /** * JPA specific extension of {@link QueryMethod}. * @@ -62,6 +61,7 @@ * @author Сергей Цыпанов * @author Réda Housni Alaoui * @author Greg Turnquist + * @author Christian Wörz */ public class JpaQueryMethod extends QueryMethod { @@ -70,20 +70,10 @@ public class JpaQueryMethod extends QueryMethod { * "https://download.oracle.com/otn-pub/jcp/persistence-2.0-fr-eval-oth-JSpec/persistence-2_0-final-spec.pdf">JPA * 2.0 Specification 2.2 Persistent Fields and Properties Page 23 - Top paragraph. */ - private static final Set> NATIVE_ARRAY_TYPES; + private static final Set> NATIVE_ARRAY_TYPES = Set.of(byte[].class, Byte[].class, char[].class, + Character[].class); private static final StoredProcedureAttributeSource storedProcedureAttributeSource = StoredProcedureAttributeSource.INSTANCE; - static { - - Set> types = new HashSet<>(); - types.add(byte[].class); - types.add(Byte[].class); - types.add(char[].class); - types.add(Character[].class); - - NATIVE_ARRAY_TYPES = Collections.unmodifiableSet(types); - } - private final QueryExtractor extractor; private final Method method; private final Class returnType; diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java index b5a41fe998..3df20d284c 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java @@ -24,6 +24,7 @@ * An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that renders a JPQL query without making any changes. * * @author Greg Turnquist + * @author Christian Wörz * @since 3.1 */ class JpqlQueryRenderer extends JpqlBaseVisitor> { @@ -142,12 +143,8 @@ public List visitIdentification_variable_declaration( tokens.addAll(visit(ctx.range_variable_declaration())); - ctx.join().forEach(joinContext -> { - tokens.addAll(visit(joinContext)); - }); - ctx.fetch_join().forEach(fetchJoinContext -> { - tokens.addAll(visit(fetchJoinContext)); - }); + ctx.join().forEach(joinContext -> tokens.addAll(visit(joinContext))); + ctx.fetch_join().forEach(fetchJoinContext -> tokens.addAll(visit(fetchJoinContext))); return tokens; } @@ -2008,9 +2005,7 @@ public List visitGeneral_case_expression(JpqlParser.Genera tokens.add(new JpaQueryParsingToken(ctx.CASE())); - ctx.when_clause().forEach(whenClauseContext -> { - tokens.addAll(visit(whenClauseContext)); - }); + ctx.when_clause().forEach(whenClauseContext -> tokens.addAll(visit(whenClauseContext))); tokens.add(new JpaQueryParsingToken(ctx.ELSE())); tokens.addAll(visit(ctx.scalar_expression())); @@ -2040,9 +2035,7 @@ public List visitSimple_case_expression(JpqlParser.Simple_ tokens.add(new JpaQueryParsingToken(ctx.CASE())); tokens.addAll(visit(ctx.case_operand())); - ctx.simple_when_clause().forEach(simpleWhenClauseContext -> { - tokens.addAll(visit(simpleWhenClauseContext)); - }); + ctx.simple_when_clause().forEach(simpleWhenClauseContext -> tokens.addAll(visit(simpleWhenClauseContext))); tokens.add(new JpaQueryParsingToken(ctx.ELSE())); tokens.addAll(visit(ctx.scalar_expression())); diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/NamedQuery.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/NamedQuery.java index 404a0673a6..1204aaefe2 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/NamedQuery.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/NamedQuery.java @@ -15,11 +15,6 @@ */ package org.springframework.data.jpa.repository.query; -import jakarta.persistence.EntityManager; -import jakarta.persistence.Query; -import jakarta.persistence.Tuple; -import jakarta.persistence.TypedQuery; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.data.jpa.provider.QueryExtractor; @@ -30,12 +25,18 @@ import org.springframework.data.repository.query.ReturnedType; import org.springframework.lang.Nullable; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import jakarta.persistence.Tuple; +import jakarta.persistence.TypedQuery; + /** * Implementation of {@link RepositoryQuery} based on {@link jakarta.persistence.NamedQuery}s. * * @author Oliver Gierke * @author Thomas Darimont * @author Mark Paluch + * @author Christian Wörz */ final class NamedQuery extends AbstractJpaQuery { @@ -98,7 +99,7 @@ private NamedQuery(JpaQueryMethod method, EntityManager em) { /** * Returns whether the named query with the given name exists. * - * @param em must not be {@literal null}. + * @param em must not be {@literal null}. * @param queryName must not be {@literal null}. */ static boolean hasNamedQuery(EntityManager em, String queryName) { @@ -107,9 +108,8 @@ static boolean hasNamedQuery(EntityManager em, String queryName) { * See DATAJPA-617, we have to use a dedicated em for the lookups to avoid a * potential rollback of the running tx. */ - EntityManager lookupEm = em.getEntityManagerFactory().createEntityManager(); - try { + try (EntityManager lookupEm = em.getEntityManagerFactory().createEntityManager()) { lookupEm.createNamedQuery(queryName); return true; } catch (IllegalArgumentException e) { @@ -118,8 +118,6 @@ static boolean hasNamedQuery(EntityManager em, String queryName) { LOG.debug(String.format("Did not find named query %s", queryName)); } return false; - } finally { - lookupEm.close(); } } @@ -127,7 +125,7 @@ static boolean hasNamedQuery(EntityManager em, String queryName) { * Looks up a named query for the given {@link org.springframework.data.repository.query.QueryMethod}. * * @param method must not be {@literal null}. - * @param em must not be {@literal null}. + * @param em must not be {@literal null}. */ @Nullable public static RepositoryQuery lookupFrom(JpaQueryMethod method, EntityManager em) { diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java index b3737940f5..7bef9b0b8f 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ParameterMetadataProvider.java @@ -15,10 +15,12 @@ */ package org.springframework.data.jpa.repository.query; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.ParameterExpression; - -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -36,6 +38,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.ParameterExpression; + /** * Helper class to allow easy creation of {@link ParameterMetadata}s. * @@ -46,6 +51,7 @@ * @author Jens Schauder * @author Andrey Kovalev * @author Yuriy Tsarkov + * @author Christian Wörz */ class ParameterMetadataProvider { @@ -241,17 +247,12 @@ public Object prepare(Object value) { if (String.class.equals(expression.getJavaType()) && !noWildcards) { - switch (type) { - case STARTING_WITH: - return String.format("%s%%", escape.escape(unwrapped.toString())); - case ENDING_WITH: - return String.format("%%%s", escape.escape(unwrapped.toString())); - case CONTAINING: - case NOT_CONTAINING: - return String.format("%%%s%%", escape.escape(unwrapped.toString())); - default: - return unwrapped; - } + return switch (type) { + case STARTING_WITH -> String.format("%s%%", escape.escape(unwrapped.toString())); + case ENDING_WITH -> String.format("%%%s", escape.escape(unwrapped.toString())); + case CONTAINING, NOT_CONTAINING -> String.format("%%%s%%", escape.escape(unwrapped.toString())); + default -> unwrapped; + }; } return Collection.class.isAssignableFrom(expression.getJavaType()) // diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ProcedureParameter.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ProcedureParameter.java index a9aa3c4dd1..4d693afd41 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ProcedureParameter.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ProcedureParameter.java @@ -18,16 +18,17 @@ import java.util.Objects; -import jakarta.persistence.ParameterMode; - import org.springframework.lang.Nullable; +import jakarta.persistence.ParameterMode; + /** * This class represents a Stored Procedure Parameter and an instance of the annotation * {@link jakarta.persistence.StoredProcedureParameter}. * * @author Gabriel Basilio * @author Greg Turnquist + * @author Christian Wörz */ class ProcedureParameter { @@ -61,11 +62,10 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof ProcedureParameter)) { + if (!(o instanceof ProcedureParameter that)) { return false; } - ProcedureParameter that = (ProcedureParameter) o; return Objects.equals(name, that.name) && mode == that.mode && Objects.equals(type, that.type); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java index 0d2c65072b..77c0d71d0b 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java @@ -18,24 +18,6 @@ import static jakarta.persistence.metamodel.Attribute.PersistentAttributeType.*; import static java.util.regex.Pattern.*; -import jakarta.persistence.EntityManager; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Parameter; -import jakarta.persistence.Query; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.Expression; -import jakarta.persistence.criteria.Fetch; -import jakarta.persistence.criteria.From; -import jakarta.persistence.criteria.Join; -import jakarta.persistence.criteria.JoinType; -import jakarta.persistence.metamodel.Attribute; -import jakarta.persistence.metamodel.Attribute.PersistentAttributeType; -import jakarta.persistence.metamodel.Bindable; -import jakarta.persistence.metamodel.ManagedType; -import jakarta.persistence.metamodel.PluralAttribute; -import jakarta.persistence.metamodel.SingularAttribute; - import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Member; @@ -55,6 +37,24 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import jakarta.persistence.EntityManager; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Parameter; +import jakarta.persistence.Query; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.Fetch; +import jakarta.persistence.criteria.From; +import jakarta.persistence.criteria.Join; +import jakarta.persistence.criteria.JoinType; +import jakarta.persistence.metamodel.Attribute; +import jakarta.persistence.metamodel.Attribute.PersistentAttributeType; +import jakarta.persistence.metamodel.Bindable; +import jakarta.persistence.metamodel.ManagedType; +import jakarta.persistence.metamodel.PluralAttribute; +import jakarta.persistence.metamodel.SingularAttribute; + /** * Simple utility class to create JPA queries using the default implementation of a custom parser. * @@ -80,6 +80,7 @@ * @author Simon Paradies * @author Vladislav Yukharin * @author Chris Fraser + * @author Christian Wörz */ public abstract class QueryUtils { @@ -846,12 +847,10 @@ private static boolean requiresOuterJoin(From from, PropertyPath property, return true; } - if (!(propertyPathModel instanceof Attribute)) { + if (!(propertyPathModel instanceof Attribute attribute)) { return false; } - Attribute attribute = (Attribute) propertyPathModel; - // not a persistent attribute type association (@OneToOne, @ManyToOne) if (!ASSOCIATION_TYPES.containsKey(attribute.getPersistentAttributeType())) { return false; diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/SimpleJpaQuery.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/SimpleJpaQuery.java index 8fcef0a14e..b73e407e20 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/SimpleJpaQuery.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/SimpleJpaQuery.java @@ -15,15 +15,15 @@ */ package org.springframework.data.jpa.repository.query; -import jakarta.persistence.EntityManager; -import jakarta.persistence.Query; - import org.springframework.data.jpa.repository.QueryRewriter; import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.lang.Nullable; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; + /** * {@link RepositoryQuery} implementation that inspects a {@link org.springframework.data.repository.query.QueryMethod} * for the existence of an {@link org.springframework.data.jpa.repository.Query} annotation and creates a JPA @@ -33,6 +33,7 @@ * @author Thomas Darimont * @author Mark Paluch * @author Greg Turnquist + * @author Christian Wörz */ final class SimpleJpaQuery extends AbstractStringBasedJpaQuery { @@ -47,8 +48,10 @@ final class SimpleJpaQuery extends AbstractStringBasedJpaQuery { * @param parser must not be {@literal null} */ public SimpleJpaQuery(JpaQueryMethod method, EntityManager em, @Nullable String countQueryString, - QueryRewriter queryRewriter, QueryMethodEvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) { - this(method, em, method.getRequiredAnnotatedQuery(), countQueryString, queryRewriter, evaluationContextProvider, parser); + QueryRewriter queryRewriter, QueryMethodEvaluationContextProvider evaluationContextProvider, + SpelExpressionParser parser) { + this(method, em, method.getRequiredAnnotatedQuery(), countQueryString, queryRewriter, evaluationContextProvider, + parser); } /** @@ -62,8 +65,9 @@ public SimpleJpaQuery(JpaQueryMethod method, EntityManager em, @Nullable String * @param evaluationContextProvider must not be {@literal null} * @param parser must not be {@literal null} */ - public SimpleJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, @Nullable String countQueryString, QueryRewriter queryRewriter, - QueryMethodEvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) { + public SimpleJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, @Nullable String countQueryString, + QueryRewriter queryRewriter, QueryMethodEvaluationContextProvider evaluationContextProvider, + SpelExpressionParser parser) { super(method, em, queryString, countQueryString, queryRewriter, evaluationContextProvider, parser); @@ -87,10 +91,7 @@ private void validateQuery(String query, String errorMessage, Object... argument return; } - EntityManager validatingEm = null; - - try { - validatingEm = getEntityManager().getEntityManagerFactory().createEntityManager(); + try (EntityManager validatingEm = getEntityManager().getEntityManagerFactory().createEntityManager()) { validatingEm.createQuery(query); } catch (RuntimeException e) { @@ -99,11 +100,6 @@ private void validateQuery(String query, String errorMessage, Object... argument // https://java.net/projects/jpa-spec/lists/jsr338-experts/archive/2012-07/message/17 throw new IllegalArgumentException(String.format(errorMessage, arguments), e); - } finally { - - if (validatingEm != null) { - validatingEm.close(); - } } } } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java index 1207264c4f..22ee1dfacb 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java @@ -22,17 +22,17 @@ import java.util.List; import java.util.stream.Collectors; -import jakarta.persistence.NamedStoredProcedureQueries; -import jakarta.persistence.NamedStoredProcedureQuery; -import jakarta.persistence.ParameterMode; -import jakarta.persistence.StoredProcedureParameter; - import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; +import jakarta.persistence.NamedStoredProcedureQueries; +import jakarta.persistence.NamedStoredProcedureQuery; +import jakarta.persistence.ParameterMode; +import jakarta.persistence.StoredProcedureParameter; + /** * A factory class for {@link StoredProcedureAttributes}. * @@ -44,6 +44,7 @@ * @author Jeff Sheets * @author Gabriel Basilio * @author Greg Turnquist + * @author Christian Wörz * @since 1.6 */ enum StoredProcedureAttributeSource { @@ -155,14 +156,10 @@ private List extractOutputParametersFrom(NamedStoredPr for (StoredProcedureParameter param : namedStoredProc.parameters()) { switch (param.mode()) { - case OUT: - case INOUT: - case REF_CURSOR: - outputParameters.add(param); - break; - case IN: - default: + case OUT, INOUT, REF_CURSOR -> outputParameters.add(param); + default -> { continue; + } } } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java index e56185ab1e..f4fdbdd194 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java @@ -50,6 +50,7 @@ * @author Diego Krupitza * @author Greg Turnquist * @author Yuriy Tsarkov + * @author Christian Wörz */ class StringQuery implements DeclaredQuery { @@ -264,12 +265,9 @@ private String parseParameterBindingsOfQueryIntoBindingsAndReturnCleanedQuery(St } switch (ParameterBindingType.of(typeSource)) { - - case LIKE: - + case LIKE -> { Type likeType = LikeParameterBinding.getLikeTypeFrom(matcher.group(2)); replacement = matcher.group(3); - if (parameterIndex != null) { checkAndRegister(new LikeParameterBinding(parameterIndex, likeType, expression), bindings); } else { @@ -277,25 +275,17 @@ private String parseParameterBindingsOfQueryIntoBindingsAndReturnCleanedQuery(St replacement = ":" + parameterName; } - - break; - - case IN: - + } + case IN -> { if (parameterIndex != null) { checkAndRegister(new InParameterBinding(parameterIndex, expression), bindings); } else { checkAndRegister(new InParameterBinding(parameterName, expression), bindings); } - - break; - - case AS_IS: // fall-through we don't need a special parameter binding for the given parameter. - default: - - bindings.add(parameterIndex != null // - ? new ParameterBinding(null, parameterIndex, expression) // - : new ParameterBinding(parameterName, null, expression)); + } // fall-through we don't need a special parameter binding for the given parameter. + default -> bindings.add(parameterIndex != null // + ? new ParameterBinding(null, parameterIndex, expression) // + : new ParameterBinding(parameterName, null, expression)); } if (replacement != null) { @@ -589,12 +579,10 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (!(obj instanceof ParameterBinding)) { + if (!(obj instanceof ParameterBinding that)) { return false; } - ParameterBinding that = (ParameterBinding) obj; - return nullSafeEquals(this.name, that.name) && nullSafeEquals(this.position, that.position) && nullSafeEquals(this.expression, that.expression); } @@ -755,12 +743,10 @@ public Object prepare(@Nullable Object value) { @Override public boolean equals(Object obj) { - if (!(obj instanceof LikeParameterBinding)) { + if (!(obj instanceof LikeParameterBinding that)) { return false; } - LikeParameterBinding that = (LikeParameterBinding) obj; - return super.equals(obj) && this.type.equals(that.type); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityManagerBeanDefinitionRegistrarPostProcessor.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityManagerBeanDefinitionRegistrarPostProcessor.java index f4e953576d..8bc5df59b5 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityManagerBeanDefinitionRegistrarPostProcessor.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityManagerBeanDefinitionRegistrarPostProcessor.java @@ -17,9 +17,6 @@ import static org.springframework.data.jpa.util.BeanDefinitionUtils.*; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityManagerFactory; - import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Qualifier; @@ -33,6 +30,9 @@ import org.springframework.core.Ordered; import org.springframework.orm.jpa.SharedEntityManagerCreator; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; + /** * {@link BeanFactoryPostProcessor} to register a {@link SharedEntityManagerCreator} for every * {@link EntityManagerFactory} bean definition found in the application context to enable autowiring @@ -43,6 +43,7 @@ * @author Oliver Gierke * @author Réda Housni Alaoui * @author Mark Paluch + * @author Christian Wörz */ public class EntityManagerBeanDefinitionRegistrarPostProcessor implements BeanFactoryPostProcessor, Ordered { @@ -58,18 +59,15 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) return; } - ConfigurableListableBeanFactory factory = beanFactory; - - for (EntityManagerFactoryBeanDefinition definition : getEntityManagerFactoryBeanDefinitions(factory)) { + for (EntityManagerFactoryBeanDefinition definition : getEntityManagerFactoryBeanDefinitions(beanFactory)) { BeanFactory definitionFactory = definition.getBeanFactory(); - if (!(definitionFactory instanceof BeanDefinitionRegistry)) { + if (!(definitionFactory instanceof BeanDefinitionRegistry definitionRegistry)) { continue; } String entityManagerBeanName = "jpaSharedEM_AWC_" + definition.getBeanName(); - BeanDefinitionRegistry definitionRegistry = (BeanDefinitionRegistry) definitionFactory; if (!beanFactory.containsBeanDefinition(entityManagerBeanName) && !definitionRegistry.containsBeanDefinition(entityManagerBeanName)) { diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java index 25fb4abec2..acd7f74ae2 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java @@ -15,8 +15,6 @@ */ package org.springframework.data.jpa.repository.support; -import jakarta.persistence.EntityManager; - import java.util.List; import org.springframework.data.domain.Pageable; @@ -40,6 +38,8 @@ import com.querydsl.jpa.impl.AbstractJPAQuery; import com.querydsl.jpa.impl.JPAQuery; +import jakarta.persistence.EntityManager; + /** * Helper instance to ease access to Querydsl JPA query API. * @@ -48,6 +48,7 @@ * @author Mark Paluch * @author Christoph Strobl * @author Marcus Voltolim + * @author Christian Wörz */ public class Querydsl { @@ -76,15 +77,11 @@ public Querydsl(EntityManager em, PathBuilder builder) { */ public AbstractJPAQuery> createQuery() { - switch (provider) { - case ECLIPSELINK: - return new JPAQuery<>(em, EclipseLinkTemplates.DEFAULT); - case HIBERNATE: - return new JPAQuery<>(em, HQLTemplates.DEFAULT); - case GENERIC_JPA: - default: - return new JPAQuery<>(em); - } + return switch (provider) { + case ECLIPSELINK -> new JPAQuery<>(em, EclipseLinkTemplates.DEFAULT); + case HIBERNATE -> new JPAQuery<>(em, HQLTemplates.DEFAULT); + default -> new JPAQuery<>(em); + }; } /** @@ -201,18 +198,11 @@ private NullHandling toQueryDslNullHandling(org.springframework.data.domain.Sort Assert.notNull(nullHandling, "NullHandling must not be null"); - switch (nullHandling) { - - case NULLS_FIRST: - return NullHandling.NullsFirst; - - case NULLS_LAST: - return NullHandling.NullsLast; - - case NATIVE: - default: - return NullHandling.Default; - } + return switch (nullHandling) { + case NULLS_FIRST -> NullHandling.NullsFirst; + case NULLS_LAST -> NullHandling.NullsLast; + default -> NullHandling.Default; + }; } /** diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/QuerydslRepositorySupport.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/QuerydslRepositorySupport.java index 15075375e4..1a3c89c403 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/QuerydslRepositorySupport.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/QuerydslRepositorySupport.java @@ -15,10 +15,6 @@ */ package org.springframework.data.jpa.repository.support; -import com.querydsl.jpa.impl.JPAQueryFactory; -import jakarta.annotation.PostConstruct; -import jakarta.persistence.EntityManager; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.Nullable; import org.springframework.stereotype.Repository; @@ -33,11 +29,15 @@ import com.querydsl.jpa.impl.JPADeleteClause; import com.querydsl.jpa.impl.JPAUpdateClause; +import jakarta.annotation.PostConstruct; +import jakarta.persistence.EntityManager; + /** * Base class for implementing repositories using Querydsl library. * * @author Oliver Gierke * @author Mark Paluch + * @author Christian Wörz */ @Repository public abstract class QuerydslRepositorySupport { diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/support/ClasspathScanningPersistenceUnitPostProcessor.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/support/ClasspathScanningPersistenceUnitPostProcessor.java index 0a85edba48..4a0aeecb0e 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/support/ClasspathScanningPersistenceUnitPostProcessor.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/support/ClasspathScanningPersistenceUnitPostProcessor.java @@ -21,9 +21,6 @@ import java.util.HashSet; import java.util.Set; -import jakarta.persistence.Entity; -import jakarta.persistence.MappedSuperclass; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.config.BeanDefinition; @@ -45,6 +42,9 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import jakarta.persistence.Entity; +import jakarta.persistence.MappedSuperclass; + /** * {@link PersistenceUnitPostProcessor} that will scan for classes annotated with {@link Entity} or * {@link MappedSuperclass} and add them to the {@link jakarta.persistence.PersistenceUnit} post processed. Beyond that @@ -54,6 +54,7 @@ * @author Thomas Darimont * @author Mark Paluch * @author David Madden + * @author Christian Wörz */ public class ClasspathScanningPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor, ResourceLoaderAware, EnvironmentAware { @@ -121,7 +122,8 @@ public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { for (BeanDefinition definition : provider.findCandidateComponents(basePackage)) { - LOG.debug(String.format("Registering classpath-scanned entity %s in persistence unit info", definition.getBeanClassName())); + LOG.debug(String.format("Registering classpath-scanned entity %s in persistence unit info", + definition.getBeanClassName())); if (definition.getBeanClassName() != null) { pui.addManagedClassName(definition.getBeanClassName()); @@ -130,7 +132,8 @@ public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { for (String location : scanForMappingFileLocations()) { - LOG.debug(String.format("Registering classpath-scanned entity mapping file %s in persistence unit info", location)); + LOG.debug( + String.format("Registering classpath-scanned entity mapping file %s in persistence unit info", location)); pui.addMappingFileName(location); } @@ -193,7 +196,7 @@ private Set scanForMappingFileLocations() { * @param uri * @return */ - private static String getResourcePath(URI uri) throws IOException { + private static String getResourcePath(URI uri) { if (uri.isOpaque()) { // e.g. jar:file:/foo/lib/somelib.jar!/com/acme/orm.xml diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java index 779be14457..ed5913e33d 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java @@ -25,8 +25,6 @@ import java.util.List; import java.util.Set; -import jakarta.persistence.EntityManagerFactory; - import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -38,11 +36,14 @@ import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; +import jakarta.persistence.EntityManagerFactory; + /** * Utility methods to work with {@link BeanDefinition} instances from {@link BeanFactoryPostProcessor}s. * * @author Oliver Gierke * @author Mark Paluch + * @author Christian Wörz */ public final class BeanDefinitionUtils { @@ -222,12 +223,10 @@ public boolean equals(Object o) { return true; } - if (!(o instanceof EntityManagerFactoryBeanDefinition)) { + if (!(o instanceof EntityManagerFactoryBeanDefinition that)) { return false; } - EntityManagerFactoryBeanDefinition that = (EntityManagerFactoryBeanDefinition) o; - if (!ObjectUtils.nullSafeEquals(beanName, that.beanName)) { return false; } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java index 5d1b4ea7e6..642c7ccc6e 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java @@ -18,10 +18,16 @@ import java.util.Collection; import java.util.EnumSet; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.data.util.Lazy; +import org.springframework.data.util.StreamUtils; +import org.springframework.util.Assert; + import jakarta.persistence.Embeddable; import jakarta.persistence.metamodel.EntityType; import jakarta.persistence.metamodel.ManagedType; @@ -29,17 +35,13 @@ import jakarta.persistence.metamodel.SingularAttribute; import jakarta.persistence.metamodel.Type.PersistenceType; -import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.data.util.Lazy; -import org.springframework.data.util.StreamUtils; -import org.springframework.util.Assert; - /** * Wrapper around the JPA {@link Metamodel} to be able to apply some fixes against bugs in provider implementations. * * @author Oliver Gierke * @author Mark Paluch * @author Sylvère Richard + * @author Christian Wörz */ public class JpaMetamodel { @@ -65,12 +67,11 @@ private JpaMetamodel(Metamodel metamodel) { this.managedTypes = Lazy.of(() -> metamodel.getManagedTypes().stream() // .map(ManagedType::getJavaType) // - .filter(it -> it != null) // + .filter(Objects::nonNull) // .collect(StreamUtils.toUnmodifiableSet())); this.jpaEmbeddables = Lazy.of(() -> metamodel.getEmbeddables().stream() // - .map(ManagedType::getJavaType) - .filter(it -> it != null) + .map(ManagedType::getJavaType).filter(Objects::nonNull) .filter(it -> AnnotatedElementUtils.isAnnotated(it, Embeddable.class)) .collect(StreamUtils.toUnmodifiableSet())); } @@ -105,7 +106,7 @@ public boolean isSingleIdAttribute(Class entity, String name, Class attrib return metamodel.getEntities().stream() // .filter(it -> entity.equals(it.getJavaType())) // .findFirst() // - .flatMap(it -> getSingularIdAttribute(it)) // + .flatMap(JpaMetamodel::getSingularIdAttribute) // .filter(it -> it.getJavaType().equals(attributeType)) // .map(it -> it.getName().equals(name)) // .orElse(false); diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodelCacheCleanup.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodelCacheCleanup.java index 2de7d78a07..5f86b336e1 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodelCacheCleanup.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodelCacheCleanup.java @@ -24,13 +24,14 @@ * * @author Oliver Gierke * @author Sylvère Richard + * @author Christian Wörz * @see org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension#registerBeansForRoot(org.springframework.beans.factory.support.BeanDefinitionRegistry, * org.springframework.data.repository.config.RepositoryConfigurationSource) */ class JpaMetamodelCacheCleanup implements DisposableBean { @Override - public void destroy() throws Exception { + public void destroy() { JpaMetamodel.clear(); } } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemId.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemId.java index 441bf23f8e..4cace7b934 100755 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemId.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemId.java @@ -16,9 +16,11 @@ package org.springframework.data.jpa.domain.sample; import java.io.Serializable; +import java.util.Objects; /** * @author Mark Paluch + * @author Christian Wörz * @see Final JPA 2.1 * Specification 2.4.1.3 Derived Identities Example 2 */ @@ -56,14 +58,12 @@ public void setManufacturerId(Integer manufacturerId) { public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof ItemId)) + if (!(o instanceof ItemId itemId)) return false; - ItemId itemId = (ItemId) o; - - if (id != null ? !id.equals(itemId.id) : itemId.id != null) + if (!Objects.equals(id, itemId.id)) return false; - return manufacturerId != null ? manufacturerId.equals(itemId.manufacturerId) : itemId.manufacturerId == null; + return Objects.equals(manufacturerId, itemId.manufacturerId); } @Override diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemSiteId.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemSiteId.java index 681aca4c9c..5759d06e4c 100755 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemSiteId.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/ItemSiteId.java @@ -16,9 +16,11 @@ package org.springframework.data.jpa.domain.sample; import java.io.Serializable; +import java.util.Objects; /** * @author Mark Paluch + * @author Christian Wörz * @see Final JPA 2.1 * Specification 2.4.1.3 Derived Identities Example 2 */ @@ -40,14 +42,12 @@ public ItemSiteId(ItemId item, Integer site) { public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof ItemSiteId)) + if (!(o instanceof ItemSiteId that)) return false; - ItemSiteId that = (ItemSiteId) o; - - if (item != null ? !item.equals(that.item) : that.item != null) + if (!Objects.equals(item, that.item)) return false; - return site != null ? site.equals(that.site) : that.site == null; + return Objects.equals(site, that.site); } @Override diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/SampleWithIdClass.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/SampleWithIdClass.java index ba1cef184a..1b5479d26f 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/SampleWithIdClass.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/SampleWithIdClass.java @@ -29,12 +29,10 @@ public boolean equals(Object obj) { return true; } - if (!(obj instanceof SampleWithIdClassPK)) { + if (!(obj instanceof SampleWithIdClassPK that)) { return false; } - SampleWithIdClassPK that = (SampleWithIdClassPK) obj; - return this.first.equals(that.first) && this.second.equals(that.second); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/User.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/User.java index f61e269d68..28e0135849 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/User.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/domain/sample/User.java @@ -15,13 +15,13 @@ */ package org.springframework.data.jpa.domain.sample; -import jakarta.persistence.*; - import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Set; +import jakarta.persistence.*; + /** * Domain class representing a person emphasizing the use of {@code AbstractEntity}. No declaration of an id is * required. The id is typed by the parameterizable superclass. @@ -33,6 +33,7 @@ * @author Jeff Sheets * @author JyotirmoyVS * @author Greg Turnquist + * @author Christian Wörz */ @Entity @NamedEntityGraphs({ @NamedEntityGraph(name = "User.overview", attributeNodes = { @NamedAttributeNode("roles") }), @@ -92,7 +93,8 @@ @Table(name = "SD_User") public class User { - @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String firstname; private String lastname; private int age; @@ -365,12 +367,10 @@ public byte[] getBinaryData() { @Override public boolean equals(Object obj) { - if (!(obj instanceof User)) { + if (!(obj instanceof User that)) { return false; } - User that = (User) obj; - if ((null == this.getId()) || (null == that.getId())) { return false; } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderIntegrationTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderIntegrationTests.java index c8251966ff..9d8b64e59c 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderIntegrationTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderIntegrationTests.java @@ -15,9 +15,7 @@ */ package org.springframework.data.jpa.provider; -import static org.assertj.core.api.Assertions.assertThat; - -import jakarta.persistence.EntityManager; +import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -35,16 +33,18 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; +import jakarta.persistence.EntityManager; + /** * Integration tests for {@link PersistenceProvider}. * * @author Oliver Gierke * @author Jens Schauder * @author Krzysztof Krason + * @author Christian Wörz */ @ExtendWith(SpringExtension.class) @ContextConfiguration @@ -67,19 +67,15 @@ void setUp() { @Test // DATAJPA-630 public void testname() { - new TransactionTemplate(transactionManager).execute(new TransactionCallback() { - - @Override - public Void doInTransaction(TransactionStatus status) { + new TransactionTemplate(transactionManager).execute((TransactionCallback) status -> { - Product product = categories.findById(category.getId()).get().getProduct(); - ProxyIdAccessor accessor = PersistenceProvider.fromEntityManager(em); + Product product = categories.findById(category.getId()).get().getProduct(); + ProxyIdAccessor accessor = PersistenceProvider.fromEntityManager(em); - assertThat(accessor.shouldUseAccessorFor(product)).isTrue(); - assertThat(accessor.getIdentifierFrom(product)).hasToString(product.getId().toString()); + assertThat(accessor.shouldUseAccessorFor(product)).isTrue(); + assertThat(accessor.getIdentifierFrom(product)).hasToString(product.getId().toString()); - return null; - } + return null; }); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java index b149498d9f..ac64addd68 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/ParentRepositoryIntegrationTests.java @@ -15,13 +15,7 @@ */ package org.springframework.data.jpa.repository; -import static org.assertj.core.api.Assertions.assertThat; - -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Path; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; +import static org.assertj.core.api.Assertions.*; import java.util.List; import java.util.Set; @@ -41,9 +35,12 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; +import jakarta.persistence.criteria.Path; + /** * @author Jens Schauder * @author Krzysztof Krason + * @author Christian Wörz */ @Transactional @ExtendWith(SpringExtension.class) @@ -65,13 +62,10 @@ void setUp() { @Test // DATAJPA-287 void testWithoutJoin() { - Page page = repository.findAll(new Specification() { - @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { - Path> childrenPath = root.get("children"); - query.distinct(true); - return cb.isNotEmpty(childrenPath); - } + Page page = repository.findAll((Specification) (root, query, cb) -> { + Path> childrenPath = root.get("children"); + query.distinct(true); + return cb.isNotEmpty(childrenPath); }, PageRequest.of(0, 5, Sort.by(Sort.Direction.ASC, "id"))); List content = page.getContent(); @@ -86,14 +80,11 @@ public Predicate toPredicate(Root root, CriteriaQuery query, Criteria @Test // DATAJPA-287 void testWithJoin() { - Page page = repository.findAll(new Specification() { - @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { - root.join("children"); - // we are interesting in distinct items, especially when join presents in query - query.distinct(true); - return cb.isNotEmpty(root.> get("children")); - } + Page page = repository.findAll((Specification) (root, query, cb) -> { + root.join("children"); + // we are interesting in distinct items, especially when join presents in query + query.distinct(true); + return cb.isNotEmpty(root.> get("children")); }, PageRequest.of(0, 5, Sort.by(Sort.Direction.ASC, "id"))); List content = page.getContent(); diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/RepositoryWithIdClassKeyTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/RepositoryWithIdClassKeyTests.java index e19eb33b25..be312a3572 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/RepositoryWithIdClassKeyTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/RepositoryWithIdClassKeyTests.java @@ -48,6 +48,7 @@ * @author Mark Paluch * @author Jens Schauder * @author Krzysztof Krason + * @author Christian Wörz */ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = RepositoryWithIdClassKeyTests.TestConfig.class) @@ -88,15 +89,15 @@ void shouldScrollWithKeyset() { itemRepository.saveAllAndFlush(Arrays.asList(item1, item2, item3)); - Window first = itemRepository.findBy((root, query, criteriaBuilder) -> { - return criteriaBuilder.isNotNull(root.get("name")); - }, q -> q.limit(1).sortBy(Sort.by("name")).scroll(ScrollPosition.keyset())); + Window first = itemRepository.findBy( + (root, query, criteriaBuilder) -> criteriaBuilder.isNotNull(root.get("name")), + q -> q.limit(1).sortBy(Sort.by("name")).scroll(ScrollPosition.keyset())); assertThat(first).containsOnly(item1); - Window next = itemRepository.findBy((root, query, criteriaBuilder) -> { - return criteriaBuilder.isNotNull(root.get("name")); - }, q -> q.limit(1).sortBy(Sort.by("name")).scroll(first.positionAt(0))); + Window next = itemRepository.findBy( + (root, query, criteriaBuilder) -> criteriaBuilder.isNotNull(root.get("name")), + q -> q.limit(1).sortBy(Sort.by("name")).scroll(first.positionAt(0))); assertThat(next).containsOnly(item2); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index 00a1750a59..7a4f902ad7 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -24,14 +24,6 @@ import static org.springframework.data.jpa.domain.Specification.not; import static org.springframework.data.jpa.domain.sample.UserSpecifications.*; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import jakarta.persistence.Query; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -70,6 +62,10 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; + /** * Base integration test class for {@code UserRepository}. Loads a basic (non-namespace) Spring configuration file as * well as Hibernate configuration to execute tests. @@ -92,6 +88,7 @@ * @author Simon Paradies * @author Geoffrey Deremetz * @author Krzysztof Krason + * @author Christian Wörz */ @ExtendWith(SpringExtension.class) @ContextConfiguration("classpath:application-context.xml") @@ -931,12 +928,9 @@ void doesNotDropNullValuesOnPagedSpecificationExecution() { flushTestUsers(); - Page page = repository.findAll(new Specification() { - @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { - return cb.equal(root.get("lastname"), "Gierke"); - } - }, PageRequest.of(0, 20, Sort.by("manager.lastname"))); + Page page = repository.findAll( + (Specification) (root, query, cb) -> cb.equal(root.get("lastname"), "Gierke"), + PageRequest.of(0, 20, Sort.by("manager.lastname"))); assertThat(page.getNumberOfElements()).isOne(); assertThat(page).containsOnly(firstUser); @@ -2777,9 +2771,8 @@ public String toString() { } } - assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> { - repository.findBy(userHasFirstnameLike("v"), q -> q.as(UserDto.class).sortBy(Sort.by("firstname")).all()); - }); + assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> repository + .findBy(userHasFirstnameLike("v"), q -> q.as(UserDto.class).sortBy(Sort.by("firstname")).all())); } @Test // GH-2274 diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategyUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategyUnitTests.java index 41355c6e91..1048e879e1 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategyUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategyUnitTests.java @@ -18,14 +18,9 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityManagerFactory; -import jakarta.persistence.metamodel.Metamodel; - import java.lang.reflect.Method; import java.util.List; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -51,6 +46,10 @@ import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; import org.springframework.data.repository.query.RepositoryQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.metamodel.Metamodel; + /** * Unit tests for {@link JpaQueryLookupStrategy}. * @@ -59,6 +58,7 @@ * @author Jens Schauder * @author Réda Housni Alaoui * @author Greg Turnquist + * @author Christian Wörz */ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -191,7 +191,7 @@ void noQueryShouldNotBeInvoked() { RepositoryQuery query = new JpaQueryLookupStrategy.NoQuery(); assertThatIllegalStateException().isThrownBy(() -> query.execute(new Object[] {})); - assertThatIllegalStateException().isThrownBy(() -> query.getQueryMethod()); + assertThatIllegalStateException().isThrownBy(query::getQueryMethod); } @Disabled("invalid to both JpqlParse and to JSqlParser") diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlQueryRendererTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlQueryRendererTests.java index 989e9319f7..879560e24b 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlQueryRendererTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlQueryRendererTests.java @@ -30,6 +30,7 @@ * IMPORTANT: Purely verifies the parser without any transformations. * * @author Greg Turnquist + * @author Christian Wörz * @since 3.1 */ class JpqlQueryRendererTests { @@ -762,14 +763,12 @@ void theRest23() { @Test void theRest24() { - assertThatExceptionOfType(BadJpqlGrammarException.class).isThrownBy(() -> { - assertQuery(""" - SELECT p.product_name - FROM Order o, IN(o.lineItems) l JOIN o.customer c - WHERE c.lastname = 'Smith' AND c.firstname = 'John' - ORDER BY o.quantity - """); - }); + assertThatExceptionOfType(BadJpqlGrammarException.class).isThrownBy(() -> assertQuery(""" + SELECT p.product_name + FROM Order o, IN(o.lineItems) l JOIN o.customer c + WHERE c.lastname = 'Smith' AND c.firstname = 'John' + ORDER BY o.quantity + """)); } @Test diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlSpecificationTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlSpecificationTests.java index df12231d43..67cd0cf62f 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlSpecificationTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlSpecificationTests.java @@ -27,6 +27,7 @@ * IMPORTANT: Purely verifies the parser without any transformations. * * @author Greg Turnquist + * @author Christian Wörz * @since 3.1 */ class JpqlSpecificationTests { @@ -733,14 +734,12 @@ void theRest23() { @Test void theRest24() { - assertThatExceptionOfType(BadJpqlGrammarException.class).isThrownBy(() -> { - JpqlQueryParser.parseQuery(""" - SELECT p.product_name - FROM Order o, IN(o.lineItems) l JOIN o.customer c - WHERE c.lastname = 'Smith' AND c.firstname = 'John' - ORDER BY o.quantity - """); - }); + assertThatExceptionOfType(BadJpqlGrammarException.class).isThrownBy(() -> JpqlQueryParser.parseQuery(""" + SELECT p.product_name + FROM Order o, IN(o.lineItems) l JOIN o.customer c + WHERE c.lastname = 'Smith' AND c.firstname = 'John' + ORDER BY o.quantity + """)); } @Test diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/MetaAnnotatedQueryMethodIntegrationTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/MetaAnnotatedQueryMethodIntegrationTests.java index 7703e978d2..813c7d85b6 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/MetaAnnotatedQueryMethodIntegrationTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/MetaAnnotatedQueryMethodIntegrationTests.java @@ -197,7 +197,7 @@ void deleteAllInBatchShouldLogAComment() { private void assertAtLeastOneComment() { assertThat(testAppender.list).extracting(ILoggingEvent::getFormattedMessage) - .haveAtLeastOne(new Condition(hasComment, "SQL contains a comment")); + .haveAtLeastOne(new Condition<>(hasComment, "SQL contains a comment")); } private void assertNoComments() { diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/SampleEvaluationContextExtension.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/SampleEvaluationContextExtension.java index cfa7ade47f..4d757a78a4 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/SampleEvaluationContextExtension.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/SampleEvaluationContextExtension.java @@ -24,6 +24,7 @@ * A sample implementation of a custom {@link EvaluationContextExtension}. * * @author Thomas Darimont + * @author Christian Wörz */ public class SampleEvaluationContextExtension implements EvaluationContextExtension { @@ -42,14 +43,8 @@ public Map getProperties() { */ public static class SampleSecurityContextHolder { - private static ThreadLocal auth = new ThreadLocal() { - - @Override - protected SampleAuthentication initialValue() { - return new SampleAuthentication(new SampleUser(-1, "anonymous")); - } - - }; + private static ThreadLocal auth = ThreadLocal + .withInitial(() -> new SampleAuthentication(new SampleUser(-1, "anonymous"))); public static SampleAuthentication getCurrent() { return auth.get(); diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/CrudMethodMetadataPopulatingMethodInterceptorUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/CrudMethodMetadataPopulatingMethodInterceptorUnitTests.java index e23474fb3f..ebaa2f0761 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/CrudMethodMetadataPopulatingMethodInterceptorUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/CrudMethodMetadataPopulatingMethodInterceptorUnitTests.java @@ -20,8 +20,6 @@ import java.lang.reflect.Method; -import jakarta.persistence.LockModeType; - import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.junit.jupiter.api.Test; @@ -30,19 +28,21 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; - import org.springframework.aop.framework.ProxyFactory; import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor.CrudMethodMetadataPopulatingMethodInterceptor; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.transaction.support.TransactionSynchronizationManager; +import jakarta.persistence.LockModeType; + /** * Unit tests for {@link CrudMethodMetadataPopulatingMethodInterceptor}. * * @author Oliver Gierke * @author Mark Paluch * @author Jens Schauder + * @author Christian Wörz */ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -57,13 +57,9 @@ private static Sample expectLockModeType(CrudMethodMetadata metadata, Repository ProxyFactory factory = new ProxyFactory(new Object()); factory.addInterface(Sample.class); factory.addAdvice(new CrudMethodMetadataPopulatingMethodInterceptor(information)); - factory.addAdvice(new MethodInterceptor() { - - @Override - public Object invoke(MethodInvocation invocation) { - assertThat(metadata.getLockModeType()).isEqualTo(type); - return null; - } + factory.addAdvice((MethodInterceptor) invocation -> { + assertThat(metadata.getLockModeType()).isEqualTo(type); + return null; }); return (Sample) factory.getProxy(); diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/JpaRepositoryTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/JpaRepositoryTests.java index 586ef06687..1dac622fda 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/JpaRepositoryTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/JpaRepositoryTests.java @@ -17,9 +17,6 @@ import static org.assertj.core.api.Assertions.*; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; - import java.util.Arrays; import java.util.Iterator; import java.util.List; @@ -38,6 +35,9 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; + /** * Integration test for {@link JpaRepository}. * @@ -46,6 +46,7 @@ * @author Jens Schauder * @author Greg Turnquist * @author Krzysztof Krason + * @author Christian Wörz */ @ExtendWith(SpringExtension.class) @ContextConfiguration({ "classpath:infrastructure.xml" }) @@ -146,9 +147,9 @@ void deleteAllByIdInBatchShouldConvertAnIterableToACollection() { * Wrap a {@link List} inside an {@link Iterable} to verify that {@link SimpleJpaRepository} can properly convert a * pure {@link Iterable} to a {@link Collection}. */ - Iterable ids = new Iterable() { + Iterable ids = new Iterable<>() { - private List ids = Arrays.asList(new SampleEntityPK("one", "eins"), + private final List ids = Arrays.asList(new SampleEntityPK("one", "eins"), new SampleEntityPK("three", "drei")); @NotNull diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/util/HidingClassLoader.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/util/HidingClassLoader.java index e9046a2428..39b73225b4 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/util/HidingClassLoader.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/util/HidingClassLoader.java @@ -35,6 +35,7 @@ * @author Jens Schauder * @author Oliver Gierke * @author Christoph Strobl + * @author Christian Wörz */ public class HidingClassLoader extends ShadowingClassLoader { @@ -80,7 +81,7 @@ public static HidingClassLoader hideTypes(Class... types) { Assert.notNull(types, "Types must not be null!"); return new HidingClassLoader(Arrays.stream(types)// - .map(it -> it.getName())// + .map(Class::getName)// .collect(Collectors.toList())); }