Я как бы новичок в Hibernate. Я должен выполнить следующий запрос с Hibernate. Не могли бы вы помочь мне решить эту проблему? Я искал в Google, но не смог найти решение. Может быть, я искал неправильный раздел.Множественный вложенный запрос выбора в спящем режиме
SELECT s.name state_name,
(SELECT count (*)
FROM male m
WHERE m.id = s.id male,
(SELECT count (*)
FROM female f
WHERE f.id = s.id female
FROM state s;
Я могу найти количество отдельно, но проблема в том, что я не могу добавить их все в одном запросе.
запрос должен найти мне результат ниже:
state_name male female
ABCD 10 5
MNOP 7 15
Любая помощь высоко ценится. Благодарю.
Ниже мой подход:
public void populateCountForStateByGender() {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<PopulationCount> query = criteriaBuilder.createQuery(PopulationCount.class);
query = getQueryWithSummaryColumns(query, criteriaBuilder);
TypedQuery<PopulationCount> typedQuery = entityManager.createQuery(query);
List<PopulationCount> rows = typedQuery.getResultList();
}
private <T> CriteriaQuery<T> getQueryWithSummaryColumns(CriteriaQuery<T> query, CriteriaBuilder cb) {
Root<State> root = query.from(State.class);
Root<Population> populationOccurrence = query.from(Population.class);
Expression<Short> statusOfOccurrence = errorOccurrence.get(Population_.gender);
LinkedList<Selection<? extends Object>> columns = new LinkedList<Selection<? extends Object>>();
Predicate correlatePredicate = cb.equal(
populationOccurrence.get(Population_.stateId), root);
columns.add(root.get(State_.id));
columns.add(cb.count((cb.selectCase().when(
cb.equal(statusOfOccurrence, GenderStatus.MALE.getCodeValue()), 1L))));
columns.add(cb.count((cb.selectCase().when(
cb.equal(statusOfOccurrence, GenderStatus.FEMALE.getCodeValue()), 1L))));
query.where(correlatePredicate);
query.multiselect(columns);
return query;
}
Теперь TypedQuery<PopulationCount> typedQuery = entityManager.createQuery(query);
дает мне NullPointerException.
Просто для информации: населения & государства являются классами сущностей И PopulationCount является POJO с геттерами и сеттерами для хранения результата
Привет, Джерритан, Спасибо за ответ. Да, у меня есть класс StateSummary для сопоставления сгенерированного набора результатов. Но можно ли достичь этого с помощью критериев? Но еще раз спасибо за ваш ответ. –
Проблема в том, что данные, которые вы извлекаете из базы данных, представляют собой агрегацию, это не простые данные, которые можно легко отобразить в класс java. Может быть, вы должны спросить себя, почему вы хотите, чтобы он использовал критерии в первую очередь? – gerrytan