You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/02/21 17:21:46 UTC
(grails-core) 11/22: Resolve raw type warnings and parameterized criteria query logic
This is an automated email from the ASF dual-hosted git repository.
borinquenkid pushed a commit to branch 8.0.x-hibernate7
in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 1e02d36a681576e0f9b1c1a355bbccae53ef9feb
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Fri Feb 20 11:28:54 2026 -0600
Resolve raw type warnings and parameterized criteria query logic
---
.../grails/orm/hibernate/query/HibernateQuery.java | 8 +--
.../hibernate/query/JpaCriteriaQueryCreator.java | 79 +++++++++++-----------
.../orm/hibernate/query/JpaFromProvider.java | 16 ++---
.../orm/hibernate/query/PredicateGenerator.java | 26 +++----
4 files changed, 63 insertions(+), 66 deletions(-)
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java
index 53605fa7a5..fafeb88b7e 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java
@@ -55,14 +55,14 @@ public class HibernateQuery extends Query {
protected static final String ALIAS = "_alias";
protected String alias;
protected int aliasCount;
- public DetachedCriteria getDetachedCriteria() {
+ public DetachedCriteria<?> getDetachedCriteria() {
return detachedCriteria;
}
protected Map<String, CriteriaAndAlias> createdAssociationPaths = new HashMap<>();
protected LinkedList<String> aliasStack = new LinkedList<>();
protected LinkedList<PersistentEntity> entityStack = new LinkedList<PersistentEntity>();
protected LinkedList<Association> associationStack = new LinkedList<Association>();
- protected DetachedCriteria detachedCriteria;
+ protected DetachedCriteria<?> detachedCriteria;
protected ProxyHandler proxyHandler = new HibernateProxyHandler();
private Integer fetchSize;
@@ -76,7 +76,7 @@ public class HibernateQuery extends Query {
}
- public void setDetachedCriteria(DetachedCriteria detachedCriteria) {
+ public void setDetachedCriteria(DetachedCriteria<?> detachedCriteria) {
this.detachedCriteria = detachedCriteria;
}
@@ -470,7 +470,7 @@ public class HibernateQuery extends Query {
- public DetachedCriteria getHibernateCriteria() {
+ public DetachedCriteria<?> getHibernateCriteria() {
return detachedCriteria;
}
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java
index e31645ea53..6162991cf4 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaCriteriaQueryCreator.java
@@ -5,6 +5,10 @@ import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.From;
import jakarta.persistence.criteria.Path;
+import jakarta.persistence.criteria.Root;
+import jakarta.persistence.criteria.Selection;
+import jakarta.persistence.criteria.Order;
+import jakarta.persistence.criteria.Predicate;
import org.grails.datastore.mapping.model.PersistentEntity;
import org.grails.datastore.mapping.query.Query;
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
@@ -15,19 +19,20 @@ import java.util.List;
import java.util.Objects;
import java.util.function.Function;
+@SuppressWarnings({"unchecked", "rawtypes"})
public class JpaCriteriaQueryCreator {
private final Query.ProjectionList projections;
private final HibernateCriteriaBuilder criteriaBuilder;
private final PersistentEntity entity;
- private final DetachedCriteria detachedCriteria;
+ private final DetachedCriteria<?> detachedCriteria;
public JpaCriteriaQueryCreator(
Query.ProjectionList projections
, HibernateCriteriaBuilder criteriaBuilder
, PersistentEntity entity
- , DetachedCriteria detachedCriteria
+ , DetachedCriteria<?> detachedCriteria
) {
this.projections = projections;
this.criteriaBuilder = criteriaBuilder;
@@ -39,7 +44,7 @@ public class JpaCriteriaQueryCreator {
var projectionList = collectProjections();
var cq = createCriteriaQuery(projectionList);
- var root = cq.from(entity.getJavaClass());
+ Root<?> root = cq.from(entity.getJavaClass());
var tablesByName = new JpaFromProvider(detachedCriteria,cq,root);
@@ -73,72 +78,65 @@ public class JpaCriteriaQueryCreator {
return cq;
}
- private void assignProjections(List<Query.Projection> projections, CriteriaQuery cq, JpaFromProvider tablesByName) {
- var projectionExpressions = projections
+ private <T> void assignProjections(List<Query.Projection> projections, CriteriaQuery<T> cq, JpaFromProvider tablesByName) {
+ List<Selection<?>> projectionExpressions = (List) projections
.stream()
.map(projectionToJpaExpression(tablesByName))
.filter(Objects::nonNull)
- .map(Expression.class::cast)
.toList();
if (projectionExpressions.size() == 1) {
- cq.select(projectionExpressions.get(0));
+ cq.select((Selection<? extends T>) projectionExpressions.get(0));
} else if (projectionExpressions.size() > 1){
cq.multiselect(projectionExpressions);
} else {
- cq.select(tablesByName.getFullyQualifiedPath("root"));
+ cq.select((Selection<? extends T>) tablesByName.getFullyQualifiedPath("root"));
}
}
- private void assignGroupBy(List<Query.GroupPropertyProjection> groupProjections, From root, CriteriaQuery cq, JpaFromProvider tablesByName) {
+ private void assignGroupBy(List<Query.GroupPropertyProjection> groupProjections, From<?, ?> root, CriteriaQuery<?> cq, JpaFromProvider tablesByName) {
if (!groupProjections.isEmpty()) {
- List<Expression> groupByPaths = groupProjections
+ List<Expression<?>> groupByPaths = (List) groupProjections
.stream()
.map(groupPropertyProjection -> {
String propertyName = groupPropertyProjection.getPropertyName();
return tablesByName.getFullyQualifiedPath(propertyName);
})
- .map(Expression.class::cast)
+ .filter(Objects::nonNull)
.toList();
cq.groupBy(groupByPaths);
}
}
- private void assignOrderBy(CriteriaQuery cq, JpaFromProvider tablesByName) {
+ private void assignOrderBy(CriteriaQuery<?> cq, JpaFromProvider tablesByName) {
List<Query.Order> orders = detachedCriteria.getOrders();
if (!orders.isEmpty()) {
- cq.orderBy(orders
- .stream()
+ List<Order> jpaOrders = (List) orders.stream()
.map(order -> {
- Path expression = tablesByName.getFullyQualifiedPath(order.getProperty());
+ Path<?> expression = tablesByName.getFullyQualifiedPath(order.getProperty());
if (order.isIgnoreCase() && expression.getJavaType().equals(String.class)) {
- if (order.getDirection().equals(Query.Order.Direction.ASC)) {
- return criteriaBuilder.asc(criteriaBuilder.lower(expression));
- } else {
- return criteriaBuilder.desc(criteriaBuilder.lower(expression));
- }
+ return order.getDirection().equals(Query.Order.Direction.ASC)
+ ? criteriaBuilder.asc(criteriaBuilder.lower((Expression<String>) expression))
+ : criteriaBuilder.desc(criteriaBuilder.lower((Expression<String>) expression));
} else {
- if (order.getDirection().equals(Query.Order.Direction.ASC)) {
- return criteriaBuilder.asc(expression);
- } else {
- return criteriaBuilder.desc(expression);
- }
+ return order.getDirection().equals(Query.Order.Direction.ASC)
+ ? criteriaBuilder.asc(expression)
+ : criteriaBuilder.desc(expression);
}
-
})
- .toList()
- );
+ .toList();
+ cq.orderBy(jpaOrders);
}
}
- private void assignCriteria(CriteriaQuery cq , From root, JpaFromProvider tablesByName, PersistentEntity entity) {
- List<Query.Criterion> criteriaList =detachedCriteria.getCriteria();
+ private void assignCriteria(CriteriaQuery<?> cq, From<?, ?> root, JpaFromProvider tablesByName, PersistentEntity entity) {
+ List<Query.Criterion> criteriaList = detachedCriteria.getCriteria();
if (!criteriaList.isEmpty()) {
- jakarta.persistence.criteria.Predicate[] predicates = new PredicateGenerator().getPredicates(criteriaBuilder, cq, root, criteriaList, tablesByName,entity);
+ Predicate[] predicates = new PredicateGenerator().getPredicates(criteriaBuilder, cq, root, criteriaList, tablesByName, entity);
cq.where(criteriaBuilder.and(predicates));
}
}
- private Function<Query.Projection, JpaExpression> projectionToJpaExpression(
+ private Function<Query.Projection, JpaExpression<?>> projectionToJpaExpression(
JpaFromProvider tablesByName) {
return projection -> {
if (projection instanceof Query.CountProjection) {
@@ -147,34 +145,33 @@ public class JpaCriteriaQueryCreator {
var propertyName = countDistinctProjection.getPropertyName();
return criteriaBuilder.countDistinct(tablesByName.getFullyQualifiedPath("root." + propertyName));
} else if (projection instanceof Query.IdProjection) {
- return (JpaExpression) tablesByName.getFullyQualifiedPath("root.id");
+ return (JpaExpression<?>) tablesByName.getFullyQualifiedPath("root.id");
} else if (projection instanceof Query.DistinctProjection) {
return null;
} else {
var propertyName = ((Query.PropertyProjection) projection).getPropertyName();
- Path path = tablesByName.getFullyQualifiedPath(propertyName);
+ Path<?> path = tablesByName.getFullyQualifiedPath(propertyName);
if (projection instanceof Query.MaxProjection) {
- return criteriaBuilder.max(path);
+ return criteriaBuilder.max((Expression<? extends Number>)path);
} else if (projection instanceof Query.MinProjection) {
- return criteriaBuilder.min(path);
+ return criteriaBuilder.min((Expression<? extends Number>)path);
} else if (projection instanceof Query.AvgProjection) {
- return criteriaBuilder.avg(path);
+ return criteriaBuilder.avg((Expression<? extends Number>)path);
} else if (projection instanceof Query.SumProjection) {
- return criteriaBuilder.sum(path);
+ return criteriaBuilder.sum((Expression<? extends Number>)path);
} else { // keep this last!!!
- return (JpaExpression)path;
+ return (JpaExpression<?>)path;
}
}
};
}
private List<Query.GroupPropertyProjection> collectGroupProjections() {
- List<Query.GroupPropertyProjection> groupProjections = projections.getProjectionList()
+ return projections.getProjectionList()
.stream()
.filter(Query.GroupPropertyProjection.class::isInstance)
.map(Query.GroupPropertyProjection.class::cast)
.toList();
- return groupProjections;
}
}
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java
index 1f1b67c96e..6ade44807b 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/JpaFromProvider.java
@@ -21,18 +21,18 @@ import java.util.stream.Stream;
public class JpaFromProvider implements Cloneable {
- private Map<String, From> fromMap;
+ private Map<String, From<?, ?>> fromMap;
- private JpaFromProvider(Map<String, From> fromMap) {
+ private JpaFromProvider(Map<String, From<?, ?>> fromMap) {
this.fromMap = new HashMap<>(fromMap);
}
- public JpaFromProvider(DetachedCriteria detachedCriteria, JpaCriteriaQuery<?> cq, From root) {
+ public JpaFromProvider(DetachedCriteria<?> detachedCriteria, JpaCriteriaQuery<?> cq, From<?, ?> root) {
fromMap = getFromsByName(detachedCriteria, cq, root);
}
- private Map<String, From> getFromsByName(DetachedCriteria detachedCriteria, JpaCriteriaQuery<?> cq, From root) {
+ private Map<String, From<?, ?>> getFromsByName(DetachedCriteria<?> detachedCriteria, JpaCriteriaQuery<?> cq, From<?, ?> root) {
var detachedAssociationCriteriaList = ((List<Query.Criterion>) detachedCriteria.getCriteria())
.stream()
.map(new DetachedAssociationFunction())
@@ -42,7 +42,7 @@ public class JpaFromProvider implements Cloneable {
var aliasMap = createAliasMap(detachedAssociationCriteriaList);
//The join column is column for joining from the root entity
var detachedFroms = createDetachedFroms(cq, detachedAssociationCriteriaList);
- Map<String, From> fromsByName = Stream.concat(aliasMap.keySet().stream(), ((Map<String, FetchType>) detachedCriteria.getFetchStrategies())
+ Map<String, From<?, ?>> fromsByName = Stream.concat(aliasMap.keySet().stream(), ((Map<String, FetchType>) detachedCriteria.getFetchStrategies())
.entrySet()
.stream()
.filter(entry -> entry.getValue().equals(FetchType.EAGER))
@@ -55,7 +55,7 @@ public class JpaFromProvider implements Cloneable {
.map(dac -> dac.getAssociation().getOwner().getJavaClass())
.orElse(root.getJavaType());
// Choose base From: use outer root only if join belongs to the outer root type; otherwise create a detached root for the owner
- From base = ownerClass.equals(root.getJavaType())
+ From<?, ?> base = ownerClass.equals(root.getJavaType())
? root
: detachedFroms.computeIfAbsent(joinColumn, s -> cq.from(ownerClass));
@@ -77,7 +77,7 @@ public class JpaFromProvider implements Cloneable {
return fromsByName;
}
- private Map<String, From> createDetachedFroms(JpaCriteriaQuery<?> cq, List<DetachedAssociationCriteria> detachedAssociationCriteriaList) {
+ private Map<String, From<?, ?>> createDetachedFroms(JpaCriteriaQuery<?> cq, List<DetachedAssociationCriteria> detachedAssociationCriteriaList) {
return detachedAssociationCriteriaList.stream()
.collect(Collectors.toMap(
DetachedAssociationCriteria::getAssociationPath,
@@ -121,7 +121,7 @@ public class JpaFromProvider implements Cloneable {
}
- public void put(String tableName, From child) {
+ public void put(String tableName, From<?, ?> child) {
fromMap.put(tableName, child);
}
}
diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
index aafd7bccf9..f51fb781ce 100644
--- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
+++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/query/PredicateGenerator.java
@@ -39,8 +39,8 @@ public class PredicateGenerator {
private static final Logger log = LoggerFactory.getLogger(PredicateGenerator.class);
public Predicate[] getPredicates(HibernateCriteriaBuilder cb,
- CriteriaQuery criteriaQuery,
- From root_,
+ CriteriaQuery<?> criteriaQuery,
+ From<?, ?> root_,
List criteriaList,
JpaFromProvider fromsByProvider,
PersistentEntity entity) {
@@ -56,7 +56,7 @@ public class PredicateGenerator {
return list.toArray(new Predicate[0]);
}
- private Predicate handleCriterion(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Object criterion) {
+ private Predicate handleCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Object criterion) {
if (criterion instanceof Query.Junction junction) {
return handleJunction(cb, criteriaQuery, root_, fromsByProvider, entity, junction);
} else if (criterion instanceof Query.DistinctProjection) {
@@ -77,7 +77,7 @@ public class PredicateGenerator {
throw new IllegalArgumentException("Unsupported criterion: " + criterion);
}
- private Predicate handleJunction(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Junction junction) {
+ private Predicate handleJunction(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Junction junction) {
var predicates = getPredicates(cb, criteriaQuery, root_, junction.getCriteria(), fromsByProvider, entity);
if (junction instanceof Query.Disjunction) {
return cb.or(predicates);
@@ -93,14 +93,14 @@ public class PredicateGenerator {
return null;
}
- private Predicate handleAssociationCriteria(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, DetachedAssociationCriteria<?> c) {
+ private Predicate handleAssociationCriteria(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, DetachedAssociationCriteria<?> c) {
Join child = root_.join(c.getAssociationPath(), JoinType.LEFT);
JpaFromProvider childTablesByName = (JpaFromProvider) fromsByProvider.clone();
childTablesByName.put("root", child);
return cb.and(getPredicates(cb, criteriaQuery, child, c.getCriteria(), childTablesByName, entity));
}
- private Predicate handlePropertyCriterion(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.PropertyCriterion pc) {
+ private Predicate handlePropertyCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.PropertyCriterion pc) {
var fullyQualifiedPath = fromsByProvider.getFullyQualifiedPath(pc.getProperty());
if (pc instanceof Query.NotIn c) {
@@ -147,7 +147,7 @@ public class PredicateGenerator {
return null;
}
- private Predicate handleNotIn(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.NotIn c, Path fullyQualifiedPath) {
+ private Predicate handleNotIn(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.NotIn c, Path fullyQualifiedPath) {
var queryableCriteria = getQueryableCriteriaFromInCriteria(c);
if (Objects.nonNull(queryableCriteria)) {
return cb.not(getQueryableCriteriaValue(cb, criteriaQuery, fromsByProvider, entity, c, queryableCriteria));
@@ -170,7 +170,7 @@ public class PredicateGenerator {
return cb.not(cb.in(fullyQualifiedPath, c.getValue()));
}
- private Predicate handleIn(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.In c, Path fullyQualifiedPath) {
+ private Predicate handleIn(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.In c, Path fullyQualifiedPath) {
var queryableCriteria = getQueryableCriteriaFromInCriteria(c);
if (Objects.nonNull(queryableCriteria)) {
return getQueryableCriteriaValue(cb, criteriaQuery, fromsByProvider, entity, c, queryableCriteria);
@@ -192,7 +192,7 @@ public class PredicateGenerator {
return cb.equal(cb.function(GrailsRLikeFunctionContributor.RLIKE, Boolean.class, fullyQualifiedPath, cb.literal(pattern)), true);
}
- private Predicate handleSubqueryCriterion(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.SubqueryCriterion c) {
+ private Predicate handleSubqueryCriterion(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.SubqueryCriterion c) {
Subquery subquery = criteriaQuery.subquery(Number.class);
Root from = subquery.from(c.getValue().getPersistentEntity().getJavaClass());
JpaFromProvider newMap = (JpaFromProvider) fromsByProvider.clone();
@@ -231,7 +231,7 @@ public class PredicateGenerator {
return null;
}
- private Predicate handlePropertyComparisonCriterion(HibernateCriteriaBuilder cb, JpaFromProvider fromsByProvider, From root_, Query.PropertyComparisonCriterion c) {
+ private Predicate handlePropertyComparisonCriterion(HibernateCriteriaBuilder cb, JpaFromProvider fromsByProvider, From<?, ?> root_, Query.PropertyComparisonCriterion c) {
Path path = fromsByProvider.getFullyQualifiedPath(c.getProperty());
Path otherPath = root_.get(c.getOtherProperty());
if (c instanceof Query.EqualsProperty) return cb.equal(path, otherPath);
@@ -252,7 +252,7 @@ public class PredicateGenerator {
return null;
}
- private Predicate handleExists(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, From root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Exists c) {
+ private Predicate handleExists(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, From<?, ?> root_, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.Exists c) {
Subquery subquery = criteriaQuery.subquery(Integer.class);
PersistentEntity childPersistentEntity = c.getSubquery().getPersistentEntity();
Root subRoot = subquery.from(childPersistentEntity.getJavaClass());
@@ -265,7 +265,7 @@ public class PredicateGenerator {
return cb.exists(subquery);
}
- private CriteriaBuilder.In getQueryableCriteriaValue(HibernateCriteriaBuilder cb, CriteriaQuery criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.PropertyNameCriterion criterion, QueryableCriteria queryableCriteria) {
+ private CriteriaBuilder.In getQueryableCriteriaValue(HibernateCriteriaBuilder cb, CriteriaQuery<?> criteriaQuery, JpaFromProvider fromsByProvider, PersistentEntity entity, Query.PropertyNameCriterion criterion, QueryableCriteria queryableCriteria) {
var projection = findPropertyOrIdProjection(queryableCriteria);
var subProperty = findSubproperty(projection);
var path = fromsByProvider.getFullyQualifiedPath(criterion.getProperty());
@@ -279,7 +279,7 @@ public class PredicateGenerator {
return in.value(subquery);
}
- private Predicate getExistsPredicate(HibernateCriteriaBuilder cb, From root_, PersistentEntity childPersistentEntity, Root subRoot) {
+ private Predicate getExistsPredicate(HibernateCriteriaBuilder cb, From<?, ?> root_, PersistentEntity childPersistentEntity, Root subRoot) {
Association owner = childPersistentEntity.getAssociations().stream()
.filter(assoc -> assoc.getAssociatedEntity().getJavaClass().equals(root_.getJavaType()))
.findFirst().orElseThrow();