private void resolveFirst(List<Expression> expressions, boolean allowParams) { List<PathPosition> currentPositions = pathPositions; List<PathPosition> newPositions = new ArrayList<>(); int positionsSize = currentPositions.size(); for (int j = 0; j < positionsSize; j++) { int size = expressions.size(); EXPRESSION_LOOP: for (int i = 0; i < size; i++) { PathPosition position = currentPositions.get(j).copy(); pathPositions = new ArrayList<>(); pathPositions.add(currentPosition = position); if (allowParams) { parametersAllowed = true; } expressions.get(i).accept(this); if (allowParams) { parametersAllowed = false; } // We just use the type of the first path position that we find for (PathPosition newPosition : pathPositions) { if (newPosition.getCurrentClass() != null) { newPositions.add(newPosition); break EXPRESSION_LOOP; } } } } currentPosition = null; pathPositions = newPositions; }
public List<TargetType> getPossibleTargetTypes() { List<PathPosition> positions = pathPositions; int size = positions.size(); if (managedType != null && size == 1 && positions.get(0).getAttribute() == null && managedType.getJavaType().equals(positions.get(0).getRealCurrentClass())) { // When we didn't resolve any property, the expression is probably static and we can't give types in that case return Collections.emptyList(); } List<TargetType> possibleTargets = new ArrayList<>(size); for (int i = 0; i < size; i++) { PathPosition position = positions.get(i); possibleTargets.add(new TargetTypeImpl(position.hasCollectionJoin(), position.getAttribute(), position.getRealCurrentClass(), position.getKeyCurrentClass(), position.getCurrentClass())); } return possibleTargets; }
private void resolveToFunctionReturnType(String functionName) { JpqlFunction function = functions.get(functionName.toLowerCase()); if (function == null) { return; } List<PathPosition> currentPositions = pathPositions; int positionsSize = currentPositions.size(); for (int i = 0; i < positionsSize; i++) { PathPosition position = currentPositions.get(i); Class<?> returnType = function.getReturnType(position.getCurrentClass()); position.setAttribute(null); position.setCurrentType(metamodel.type(returnType)); } }
} else { if (attribute.getJavaMember() instanceof Field) { typeArguments = ReflectionUtils.getResolvedFieldTypeArguments(currentPosition.getCurrentClass(), (Field) attribute.getJavaMember()); } else if (attribute.getJavaMember() instanceof Method) { typeArguments = ReflectionUtils.getResolvedMethodReturnTypeArguments(currentPosition.getCurrentClass(), (Method) attribute.getJavaMember()); } else { typeArguments = EMPTY; valueType = metamodel.type(JpaMetamodelUtils.resolveFieldClass(currentPosition.getCurrentClass(), attribute));
} else { if (attribute.getJavaMember() instanceof Field) { typeArguments = ReflectionUtils.getResolvedFieldTypeArguments(currentPosition.getCurrentClass(), (Field) attribute.getJavaMember()); } else if (attribute.getJavaMember() instanceof Method) { typeArguments = ReflectionUtils.getResolvedMethodReturnTypeArguments(currentPosition.getCurrentClass(), (Method) attribute.getJavaMember()); } else { typeArguments = EMPTY; valueType = metamodel.type(JpaMetamodelUtils.resolveFieldClass(currentPosition.getCurrentClass(), attribute));
if (newPosition.getCurrentClass() != null) { newPositions.add(newPosition); break EXPRESSION_LOOP; if (newPosition.getCurrentClass() != null) { newPositions.add(newPosition);
@Override public void visit(ParameterExpression expression) { // We can't infer a type here if (parametersAllowed) { // NOTE: We use null as marker for ANY TYPE currentPosition.setCurrentType(null); } else { // If there are other branches (path positions) i.e. of a case when that have a type, we can allow parameters too for (PathPosition position : pathPositions) { if (position != currentPosition) { if (position.getCurrentClass() != null) { currentPosition.setCurrentType(null); return; } } } // NOTE: plain parameters are only supported in the select clause when having an insert! invalid(expression, "Parameters are not allowed as results in mapping. Please use @MappingParameter for this instead!"); } }