33

how to get count with a namedquery, without getting all the list (it would increase performance I think). This is the named query that doesn't work:

@NamedQuery(name = "Charakteristika.findAllCount", query = "SELECT COUNT(c) FROM Charakteristika c")

Executing this:

System.out.println("a");
System.out.println(em.createNamedQuery("Charakteristika.findAllCount", Integer.class).getSingleResult().intValue());
System.out.println("b");

Output:

a

Although this query works:

@NamedQuery(name = "Charakteristika.findAll", query = "SELECT c FROM Charakteristika c")

Executing this:

System.out.println("a");
System.out.println(em.createNamedQuery("Charakteristika.findAll", Charakteristika.class).getResultList().size());
System.out.println("b");

Output:

a
11111
b
Minutis
  • 1,193
  • 1
  • 17
  • 47

4 Answers4

40

Change your code likes this;

      int count = ((Number)em.createNamedQuery("Charakteristika.findAllCount").getSingleResult()).intValue();
      System.out.println(count);
Sai Ye Yan Naing Aye
  • 6,622
  • 12
  • 47
  • 65
6

Also you can try it: use TypeQuery interface with Long value. In the next example, "PosicionHistorialDia.findNumberSpeeding" query is a jpa count.

    @Override
    public Long findCount(String eventCode) {
         TypedQuery<Long> query = em.createNamedQuery(
            "PosicionHistorialDia.findNumberSpeeding",
            Long.class);
        query.setParameter("event", eventCode);
        return query.getSingleResult();
    }
Gaalvarez
  • 165
  • 1
  • 7
2

Try:

System.out.println("a");
System.out.println(em.createNamedQuery("Charakteristika.findAllCount").getSingleResult());
System.out.println("b");

And see if it's output suggests anything to you.

Failing that,

  • try getResultList instead of getSingleResult; otherwise the same.

  • try createQuery("SELECT COUNT(c) FROM Charakteristika c").getSingleResult & getResultList

  • Explore differences in declaration of queries; as JB points out, the queries are the same. So try both names with the different forms above.

  • Examine how you're building; is this part of a deployed app? stand-alone?

Something's gotta give somewhere.

Richard Sitze
  • 8,262
  • 3
  • 36
  • 48
0

another option

@NamedQuery(name = "MyTable.countAll", query = "SELECT COUNT(*) FROM MyTable")

long total = entityManager.createNamedQuery("MyTable.countAll", Long.class).getSingleResult();
pref
  • 1,651
  • 14
  • 24