src/main/java/org/seedstack/jpa/internal/JpaUtils.java
public static Expression<?> join(String attribute, From<?, ?> from) {
        Expression<?> path;
        try {
            String[] properties = attribute.split("\\.");
            if (properties.length > 1) {
                path = joinRecursively(properties, findOrCreateJoin(properties[0], from), 1)
                        .get(properties[properties.length - 1]);
            } else {
                path = from.get(properties[0]);
            }
        } catch (IllegalArgumentException e) {
            throw SeedException.wrap(e, JpaErrorCode.UNABLE_TO_CREATE_JPA_JOIN_FOR_SPECIFICATION)
                    .put("property", attribute);
        }
        return path;
    }
public static Expression<?> join(String attribute, From<?, ?> from) {
        Expression<?> path;
        try {
            String[] properties = attribute.split("\\.");
            if (properties.length > 1) {
                path = joinRecursively(properties, findOrCreateJoin(properties[0], from), 1)
                        .get(properties[properties.length - 1]);
            } else {
                path = from.get(properties[0]);
            }
        } catch (IllegalArgumentException e) {
            throw SeedException.wrap(e, JpaErrorCode.UNABLE_TO_CREATE_JPA_JOIN_FOR_SPECIFICATION)
                    .put("property", attribute);
        }
        return path;
    }
Create a new join or find an existing join on the specified attribute.

@param attribute The attribute to join on.
@param from      The entity from.
@return the join expression.