hibernate как заказать набор в hql - PullRequest
0 голосов
/ 29 августа 2011

Я понимаю, если я использую

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

тогда мои FundClasses будут в порядке, потому что в спящем режиме используют связанный Hashset за кулисами. в то время как, если я хочу использовать предложение order by в HQL, например

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

Хотя sql возвращает записи в нужном мне порядке, набор задается не тогда, когда я перебираю его, даже я определяю его как connectedHashset. У меня есть несколько запросов, класс должен быть в порядке diffenet. иногда по имени, иногда по порядку и некоторым другим свойствам, я надеюсь, что смогу выполнить сортировку в базе данных, а не в памяти. как мне это сделать?

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

1 Ответ

0 голосов
/ 29 августа 2011

Определите его как List<FundClass>. На самом деле, я думаю, что Query.getResultList() возвращает .. список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...