Java 休眠顺序外键表

Java 休眠顺序外键表,java,angularjs,spring,hibernate,Java,Angularjs,Spring,Hibernate,我有一个RESTAPI(SpringRESTwithHibernate),它是我所有数据的访问点。客户机应用程序(Cordova和AngularJS)连接到此API进行数据馈送 我在REST API中的版本是: 弹簧:4.2.3.释放 休眠:4.3.11.最终版 问题 在客户端应用程序中,我需要一个有序列表。当我从RESTAPI请求列表时,几乎每次列表的排序都不同。这是相当烦人的,因为列表中的一些文本显示在屏幕上,现在看起来好像是在跳转 休眠 在我的项目中,我有以下Hibernate设置:

我有一个RESTAPI(SpringRESTwithHibernate),它是我所有数据的访问点。客户机应用程序(Cordova和AngularJS)连接到此API进行数据馈送

我在REST API中的版本是:

弹簧:
4.2.3.释放

休眠:
4.3.11.最终版


问题

在客户端应用程序中,我需要一个有序列表。当我从RESTAPI请求列表时,几乎每次列表的排序都不同。这是相当烦人的,因为列表中的一些文本显示在屏幕上,现在看起来好像是在跳转


休眠

在我的项目中,我有以下Hibernate设置:

公司

一家公司可以有许多员工,但一名员工一次只能在一家公司工作


休眠存储库

由于我是否使用查询的问题,下面是我的存储库(使用条件/让hibernate完成工作):


弹簧

为了更好地处理数据,我使用了序列化模型。我按如下方式实现了这个(在我的RestController中):


我的问题

有没有办法让Hibernate对通过公司实体获得的员工名单进行排序? 我知道我可以在代码中进行排序,但这对性能非常不利。因此,如果Hibernate能够订购这些物品就好了

按ID订购应该可以。如果我想要别的东西,我总是可以改变的

有人知道我如何在不影响性能的情况下实现这一点吗


解决方案

Hibernate没有针对排序依据的特定注释javax.persistence确实有用于排序的注释(
@OrderBy()
)。Hibernate检查此注释并对结果排序

您需要为此使用ArrayList,以便保留顺序(答案如下)


感谢Benjamin Bau的回答

为员工添加@OrderBy注释。将字段从集合更改为列表,以便保留顺序

@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@OrderBy("id")
@JsonBackReference
private List<Employee> employees = new ArrayList<Employee>();
@OneToMany(fetch=FetchType.LAZY,mappedBy=“companyId”,cascade={CascadeType.ALL})
@订购人(“id”)
@JsonBackReference
private List employees=new ArrayList();

您可以将EmployeeList的哈希集更改为树集,但我敢打赌您知道吗?您的findByName(companyName)是什么样子的?您是否使用任何查询?
@NotNull
@Column(name = "companyId", nullable = false)
private int companyId;
public Employee findById(int id) {
   Criteria criteria = getSession().createCriteria(Employee.class);
   criteria.add(Restrictions.eq("id", id));
   return (Employee) criteria.uniqueResult();
}
Company company = companyManager.findCompanyWithEmployees(companyName);

Set<Employee> types = company.getEmployees();
Set<EmployeeList> list = new HashSet<EmployeeList>();

for (IncidentType item : types) {
    EmployeeList newItem = new EmployeeList();
    newItem.setId(item.getId())
           .setParent(item.getParent())
           .setChildren(item.getChildren())
           .setTitle(item.getTitle())
           .setImage(item.getImage());

     list.add(newItem);
}
public Company findCompanyWithInterface(String companyName) {
   Company company = this.findByName(companyName);

   if (company == null) {
       return null;
   }
   //activate hibernate to load the employees (is LAZY loaded)
   Hibernate.initialize(company.getEmployees());

   return company;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@OrderBy("id")
@JsonBackReference
private List<Employee> employees = new ArrayList<Employee>();