Я понимаю, если я использую
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();