I am having problem with building a query with JPA Criteria API. 

Entities and significant properties:

    @Entity
    public class Post {
        @Id int id;
        @OneToMany (mappedBy = "post") Set<Comment> comments;
        //...
    }
    
    @Entity
    public class Comment {
        @Id int id;
        @ManyToOne Post post;
        //...
    }
I need a query that will return all posts from db ordered by number of
comments (`OneToMany` relation in `Post`).
At first I thought this can be implemented with `JPQL` like: 

    SELECT p 
    FROM Post p 
    ORDER BY SIZE(p.comments) DESC

But function `SIZE(...)` can not be used to be ordered by it in `JPQL`.

So, I found about `JPA Criteria API`, and tried following:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Post> cq = cb.createQuery(Post.class);
    Root<Post> p = cq.from(Post.class);
    cq.select(p);
    cq.orderBy(cb.desc(p.get("comments")));
    List<Post> resultList = em.createQuery(cq).getResultList();

With this query I am not getting proper results. I am aware that I am
missing getting `size` of the set 'comments', but don't know how to add that
part. I am not really familiar with `JPA Criteria API`. How should this
query look to get all posts ordered by size of its `comments` field(set)?



--
View this message in context: 
http://openjpa.208410.n2.nabble.com/JPA-Criteria-API-query-sorting-by-number-of-elements-in-collection-tp7585829.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to