diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java index 5794f7b571..afeaf70ad6 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java @@ -23,6 +23,7 @@ import com.mysema.query.support.Context; import com.mysema.query.support.ListAccessVisitor; import com.mysema.query.support.QueryMixin; +import com.mysema.query.types.CollectionExpression; import com.mysema.query.types.ConstantImpl; import com.mysema.query.types.EntityPath; import com.mysema.query.types.Expression; @@ -77,21 +78,33 @@ protected Expression createAlias(Expression expr, Path alias) { return super.createAlias(expr, alias); } + private Class getElementTypeOrType(Path path) { + if (path instanceof CollectionExpression) { + return ((CollectionExpression)path).getParameter(0); + } else { + return (Class) path.getType(); + } + } + private Path shorten(Path path) { PathMetadata metadata = path.getMetadata(); - if (metadata.getPathType() != PathType.PROPERTY) { + if (metadata.isRoot()) { return path; } else if (aliases.containsKey(path)) { return (Path) aliases.get(path); + } else if (metadata.getPathType() == PathType.COLLECTION_ANY) { + return (Path) shorten(metadata.getParent()); } else if (metadata.getParent().getMetadata().isRoot()) { - Path newPath = new PathImpl(path.getType(), path.toString().replace('.', '_')); + Class type = getElementTypeOrType(path); + Path newPath = new PathImpl(type, path.toString().replace('.', '_')); leftJoin(path, newPath); return newPath; } else { + Class type = getElementTypeOrType(path); Path parent = shorten(metadata.getParent()); Path oldPath = new PathImpl(path.getType(), new PathMetadata(parent, metadata.getElement(), metadata.getPathType())); - Path newPath = new PathImpl(path.getType(), oldPath.toString().replace('.', '_')); + Path newPath = new PathImpl(type, oldPath.toString().replace('.', '_')); leftJoin(oldPath, newPath); return newPath; } @@ -105,7 +118,7 @@ public Expression convert(Expression expr, boolean forOrder) { // at least three levels if (metadata.getParent() != null && !metadata.getParent().getMetadata().isRoot()) { Path shortened = shorten(metadata.getParent()); - expr = new PathImpl((Class)shortened.getType(), + expr = new PathImpl(expr.getType(), new PathMetadata(shortened, metadata.getElement(), metadata.getPathType())); } } diff --git a/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAQueryMixinTest.java b/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAQueryMixinTest.java index bbf0aa8b4d..82380d9b5b 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAQueryMixinTest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/jpa/JPAQueryMixinTest.java @@ -93,5 +93,19 @@ public void OrderBy_Long_Reuse() { md.getOrderBy()); } - // TODO test path.any() behaviour + @Test + public void OrderBy_Any() { + QCat cat = QCat.cat; + QCat cat_kittens = new QCat("cat_kittens"); + mixin.from(cat); + mixin.orderBy(cat.kittens.any().name.asc()); + + QueryMetadata md = mixin.getMetadata(); + assertEquals(Arrays.asList( + new JoinExpression(JoinType.DEFAULT, cat), + new JoinExpression(JoinType.LEFTJOIN, cat.kittens.as(cat_kittens))), + md.getJoins()); + assertEquals(Arrays.asList(cat_kittens.name.asc()), + md.getOrderBy()); + } }