Как найти максимальное значение для столбца в сопоставлении OneToMany с помощью HQL? - PullRequest
0 голосов
/ 27 мая 2020

Это классы Country и State:

Страна:

 @Entity
    @Table(name="Country")
    public class Country{
        @Id
        private String countryName;
        private String currency;
        private String capital;
        @OneToMany(mappedBy="country", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
        private List<State> statelist = new ArrayList<State>();

Состояние:

@Entity
 @Table(name="State")
 public class State{
     @Id
     private String stateName;
     private String language;
     private long population;
     @ManyToOne
     @JoinColumn(name="countryName")
     private Country country;

Каким должен быть HQL-запрос к получить штаты (возможно, в списке) с наибольшим населением в конкретной стране?

Вот код, который я написал, где я сначала попытался получить максимальное значение населения, а затем прогнать все штатов в этой стране для сопоставления с каждым значением численности населения и добавления штатов в список. Но при этом я получаю сообщение об ошибке, что столбцы в запросе определены неоднозначно.

public List<State> stateWithMaxPopulation(String countryName){
    List<State> l = new ArrayList<State>();
    Country ctr = (Country)session.get(Country.class,countryName);
    String hql = "select max(stlst.population) from Country cntry "
    +" join cntry.statelist stlst where countryName=:cNm";

    Query query = session.createQuery(hql);
    query.setParameter("cNm", countryName);
    Long maxPop = (Long)query.uniqueResult();

    for(State st : ctr.getStatelist()){
        if(st.getPopulation() == maxPop)
            l.add(st);
    }

    return l;
}

Каким должен быть правильный способ сделать это?

1 Ответ

1 голос
/ 27 мая 2020

Отсутствует псевдоним для объекта

select max(stlst.population) from Country cntry " +" join cntry.statelist stlst where cntry.countryName=:cNm1

...