PathExpression aliasedExpression = (PathExpression) selectAliasInfo.getExpression(); boolean collectionKeyPath = aliasedExpression.isCollectionKeyPath(); boolean usedInCollectionFunction = aliasedExpression.isUsedInCollectionFunction(); aliasedExpression.setCollectionKeyPath(expression.isCollectionKeyPath()); aliasedExpression.setUsedInCollectionFunction(expression.isUsedInCollectionFunction()); try { selectAliasInfo.getExpression().accept(this); super.visit(expression); } else if ((field = expression.getField()) == null) { if (expression.isUsedInCollectionFunction() || renderAbsolutePath(expression)) { super.visit(expression); } else {
expression.setCollectionKeyPath(true); if (aliasedPathExpression.isUsedInCollectionFunction()) { expression.setUsedInCollectionFunction(true);
@Override public Expression visit(PathExpression expression) { if (expression.getBaseNode() == null) { Expression aliasedExpression = ((SelectInfo) aliasManager.getAliasInfo(expression.toString())).getExpression(); Expression newExpression = aliasedExpression.accept(this); return aliasedExpression == newExpression ? expression : newExpression; } if (expression == expressionToSplit) { List<PathElementExpression> expressions = new ArrayList<>(expression.getExpressions()); for (String subAttributePart : subAttribute.split("\\.")) { expressions.add(new PropertyExpression(subAttributePart)); } String field; if (expression.getField() == null) { field = subAttribute; } else { field = expression.getField() + "." + subAttribute; } JoinNode node = (JoinNode) expression.getBaseNode(); Class<?> fieldClass = jpaProvider.getJpaMetamodelAccessor().getAttributePath(metamodel, node.getManagedType(), field).getAttributeClass(); Type<?> fieldType = metamodel.type(fieldClass); return new PathExpression( expressions, new SimplePathReference(node, field, fieldType), expression.isUsedInCollectionFunction(), expression.isCollectionKeyPath() ); } return expression; }
} else if (!pathExpression.isUsedInCollectionFunction()) { if (resultFields.isEmpty()) { result = implicitJoinSingle(current, elementExpr.toString(), targetTypeName, joinType, objectLeafAllowed, joinRequired, joinAllowed);