Need help creating JPA criteria query

前端 未结 3 632
春和景丽
春和景丽 2020-12-14 22:38

I\'m building my first Java EE web application using Glassfish and JSF. I\'m fairly new to the criteria query and I have a query I need to perform but the javaee6 tutorial s

相关标签:
3条回答
  • 2020-12-14 23:17

    Your query doesn't return a complete entity object as you're only selecting two fields of the given table (this is why you're getting an error that says yadayadapartialyadayada).

    Your solution is almost right, here's what you need to change to make it work—making it partial.

    Instead of a plain CriteriaQuery<...> you have to create a tuple CriteriaQuery<..> by calling CriteriaBuilder.createTupleQuery(). (Basically, you can call CriteriaBuilder.createQuery(...) and pass Tuple.class to it as an argument. Tuple is a sort of wildcard entity class.)

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> cq= cb.createTupleQuery();
    
    Root<Documents> root = cq.from(Documents.class);
    Expression<Integer> userId = root.get("USERID");
    Expression<String> userType = root.get("USERTYPE");
    Expression<Long> count = cb.count(userId);
    
    cq.multiselect(userId.alias("USERID"), count.alias("CNT"));
    cq.where(cb.equal(userType, "COMPANY");
    cq.groupBy(userId);
    cq.orderBy(cb.desc(count));
    
    TypedQuery<Tuple> tq = em.createQuery(cq);
    for (Tuple t : tq.getResultsList()) {
      System.out.println(t.get("USERID"));
      System.out.println(t.get("CNT"));
    }
    

    (Accessing fields of a Tuple gave me an error if I didn't use aliases for them (in multiselect(...)). This is why I've used aliases, but this can be tackled more cleanly by using JPA 2's Metamodel API, which is described in the specification quite thoroughly. )

    The documentation for CriteriaQuery.multiselect(...) describes the behaviour of queries using Tuple objects more deeply.

    0 讨论(0)
  • 2020-12-14 23:27

    Take a look into this easy tutorial. It uses JPA2 and Criteria

    http://www.jumpingbean.co.za/blogs/jpa2-criteria-api

    Regards!

    0 讨论(0)
  • 2020-12-14 23:43

    If you are using Hibernate, this should work:

    ProjectionList pl = Projections.projectionList()
    .add(Projections.groupProperty("userid"))
    .add(Projections.property("userid"))
    .add(Projections.count("userid"));
    
    Criteria criteria = session.createCriteria(Document.class)
    .add(Restrictions.eq("usertype",usertype))
    .setProjection(pl)
    .addOrder(Order.desc("cnt"));
    

    Hope it helps!

    0 讨论(0)
提交回复
热议问题