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;
    }
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.
Create a new join or find an existing join on the specified attribute .