2013-08-12 7 views
0

Я как бы новичок в 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 с геттерами и сеттерами для хранения результата

ответ

1

Один подход заключается в использовании createSQLQuery:

String sql = //.. your sql as per above 
List result = session.createSQLQuery(sql).addEntity(StateSummary.class).list(); 

Это если у вас есть класс StateSummary для сопоставления сгенерированного набора результатов, примерно так:

@Entity 
public class StateSummary { 
    private String state_name; 
    private int male; 
    private int female; 
    // getters & setters.. 
} 
+0

Привет, Джерритан, Спасибо за ответ. Да, у меня есть класс StateSummary для сопоставления сгенерированного набора результатов. Но можно ли достичь этого с помощью критериев? Но еще раз спасибо за ваш ответ. –

+0

Проблема в том, что данные, которые вы извлекаете из базы данных, представляют собой агрегацию, это не простые данные, которые можно легко отобразить в класс java. Может быть, вы должны спросить себя, почему вы хотите, чтобы он использовал критерии в первую очередь? – gerrytan

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