2014-10-01 1 views
0

Моя цель - создать метод, с помощью которого можно получить общее количество строк из любой таблицы в моей базе данных.Динамический COUNT в JPA бросает NullPointerException

Это то, что я сделал:

ENTITY_MANAGER_FACTORY = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT); 
EM = ENTITY_MANAGER_FACTORY.createEntityManager(); 

public static long getRowCount(Root<?> root) { 
    CriteriaBuilder cb = EM.getCriteriaBuilder(); 
    CriteriaQuery<Long> query = cb.createQuery(Long.class); 

    root = query.from(root.getClass()); 
    query.select(cb.count(root)); 

    return EM.createQuery(query).getSingleResult(); 
} 

Это, как я вызываю метод:

Root<PlacesEntity> placesRoot = null; 
DbTools.getRowCount(placesRoot) 

Это не работает, хотя, метод бросает NullPointerException в то line root = query.from(root.getClass());.

+1

Я не уверен, как может java-метод сбой без каких-либо исключений. Является ли JVM завершенным, или метод вызова просто ловит и игнорирует исключения? Также обратите внимание, что EntityManager не является потокобезопасным, поэтому, вероятно, его не следует инициализировать и использовать статически. Попробуйте включить ведение журнала и посмотреть, нет ли у вас чего-то. – Chris

+0

@Chris Я установил общий try catch и выглядит так, как будто это вызывает «NullPointerException». –

ответ

1

Попробуйте это (предупреждение не тестировалось):

public static long getRowCount(Class<?> rootClass) { 
    CriteriaBuilder cb = EM.getCriteriaBuilder(); 
    CriteriaQuery<Long> query = cb.createQuery(Long.class); 

    Expression<?> root = query.from(rootClass); 
    query.select(cb.count(root)); 

    return EM.createQuery(query).getSingleResult(); 
} 

/*****/ 
DbTools.getRowCount(PlacesEntity.class); 

Удачи!

+0

Это сработало! Итак, что происходит, так это то, что я в основном передаю класс в качестве параметра? –

+0

Для 'query.from' вам нужен только класс сущности. В вашем коде вы использовали класс 'Root' вместо класса« PlacesEntity ». – jmvivo

Смежные вопросы