【问题标题】:hibernate how to order set in hqlhibernate如何在hql中设置
【发布时间】:2023-04-07 21:30:02
【问题描述】:

如果我使用,我明白

  class Fund{
      private Set<FundClass> fundClasses =  new LinkedHashSet<FundClass>();
      @org.hibernate.annotations.OrderBy(clause="order asc")
        public Set<FundClass> getFundClasses() {
            return fundClasses;
        }
  }

然后我的 FundClasses 将是有序的,因为 hibernate 在幕后使用linkedHashset。同时,如果我想在 HQL 中使用 order by 子句,例如

from fund f inner join fetch f.fundClass fc order by fc.name

虽然 sql 按我想要的顺序返回记录,但是当我迭代它时,集合不是,即使我将它定义为linkedHashset。我有几个疑问,fundclass 需要按不同的顺序排列。有时按名称,有时按顺序和其他一些属性,我希望我可以在数据库中而不是在内存中进行排序。我该怎么做?

    @Entity
    @Table(name="GP")
    public class GP {

        private Integer id;
        private String name;

        private List<P> ps;
        @Id
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }

        @OneToMany(mappedBy="gp")
        public List<P> getPs() {
            return ps;
        }
        public void setPs(List<P> ps) {
            this.ps = ps;
        }

    }


@Entity
@Table(name="P")
public class P {
    private Integer id;
    private String name;

    private GP gp;
    private List<C> cs;
    @Id
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @ManyToOne
    public GP getGp() {
        return gp;
    }
    public void setGp(GP gp) {
        this.gp = gp;
    }

    @OneToMany(mappedBy="p")
    public List<C> getCs() {
        return cs;
    }
    public void setCs(List<C> cs) {
        this.cs = cs;
    }
 }
    @Entity
    @Table(name="C")
    public class C {
    private Integer id;
    private String name;

    private P p;
    @Id
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @ManyToOne
    public P getP() {
        return p;
    }

    public void setP(P p) {
        this.p = p;
        }
}

我运行的查询

 sessionFactory.getCurrentSession().createQuery("select gp from GP gp inner join fetch  gp.ps p inner join fetch p.cs c where c.age< 5 and gp.name like 'john%'").list();

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    将其定义为List&lt;FundClass&gt;。事实上,我认为Query.getResultList() 返回.. 一个列表。

    【讨论】:

    • 我不认为我可以使用列表,使用列表返回一些重复项,另外,使用列表我有不能同时获取多个包错误。
    • 您可以解决这两个问题。但我仍然不明白您如何从 HQL 查询中获得 Set。能给我看看代码吗?
    • 让我解释一下我想要做什么,我不太确定这是个好方法。我有祖父母,父母和孩子(都是一对多),要显示过滤的家庭树,我有这样的查询 select gp from grandPanent gp inner join gp.parent p inner join p.child c where gp.name像 'john%' 和 p.child.age
    • 我想要 1 个 hql,hibernate 将为我构建一个结构(只有匹配的祖父母、父母和孩子的家谱),而不是 3 个查询。先祖父母,再父母,再孩子。这样做,我有一些问题。如果不使用列表,如果我有 1 个匹配的祖父母,有 2 个父母,有 7 个匹配的孩子作为返回结果,我将有 7 个祖父母(同一个)而不是 1 个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2016-03-28
    • 2012-08-01
    • 2012-04-22
    • 2012-03-26
    • 2017-01-20
    • 2011-08-06
    相关资源
    最近更新 更多