2011-08-29 57 views
0

順序設置我明白,如果我用冬眠如何在HQL

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

然後我FundClasses會爲了,因爲背後有李宗紅,休眠使用linkedHashset。同時,如果我想by子句中HQL使用順序如

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

雖然SQL中我想要的順序返回記錄,設置,不是我這個迭代器來它,即使我把它定義爲linkedHashset 。我有幾個疑問,基金類別需要以不同的順序。有時候可以通過名字,某些時候通過訂單和其他一些屬性,我希望我可以在數據庫而不是內存中進行排序。我該怎麼做呢?

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

回答

0

定義它是一個List<FundClass>。實際上,我認爲Query.getResultList()返回..列表。

+0

我不認爲我可以使用一個列表,使用列表返回一些重複的,並且使用列表我有不能同時得到多個包的錯誤。 – Nan

+0

你可以解決這兩個問題。但是我仍然不明白你是如何從HQL查詢中獲得Set的。你能告訴我代碼嗎? – Bozho

+0

讓我解釋一下我正在嘗試做什麼,我不太確定這個好方法。我有grandParent,父母和孩子,(所有一對多),以顯示過濾familiy樹,我有這樣的查詢從grandPanent gp內部連接gp.parent內部連接p.child c選擇gp其中gp.name像'約翰%'和p.child.age <5。我想這個返回給我一個grandParent列表。我編輯問題,以便您可以看到代碼。 – Nan