如何使用 HQL 在 OneToMany 映射中查找列的最大值?

Posted

技术标签:

【中文标题】如何使用 HQL 在 OneToMany 映射中查找列的最大值?【英文标题】:How to find the maximum value for a column in an OneToMany mapping, using HQL? 【发布时间】:2020-05-27 04:31:16 【问题描述】:

这些是CountryState 类:

国家:

 @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;

正确的做法应该是什么?

【问题讨论】:

这不起作用select max(stlst.population) from Country cntry " +" join cntry.statelist stlst where cntry.countryName=:cNm1?我认为您在查询中缺少countryName 之前的实体别名 哦,它有效。我实际上拥有它,但是在处理一些错误时,我搞砸了。非常感谢。 酷。添加为您可以接受的答案 【参考方案1】:

您缺少实体的别名

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

【讨论】:

以上是关于如何使用 HQL 在 OneToMany 映射中查找列的最大值?的主要内容,如果未能解决你的问题,请参考以下文章

Hql中遇到的问题

如何在 Hibernate 中创建 OneToMany 映射? [复制]

如何正确映射@OneToMany 和@ManyToOne 关系,以便我可以保存和更新@OneToMany 端(有或没有@ManyToOne 端)

HQL 查询以检查集合的大小是不是为 0 或为空

Hibernate:映射@OneToMany 关系的最后一行

@OneToMany 映射休眠中的集合