我有一个REST API(使用 Spring REST with Hibernate ),它是我所有数据的访问点。客户端应用程序( Cordova and AngularJS )连接到此API以获取数据源。
我的REST API版本如下:
Spring:
在客户端应用程序中,我需要一个有序列表。当我从REST API请求列表时,列表几乎每次都以不同的方式排序。这非常令人烦恼,因为列表中的某些文本显示在屏幕上,现在看起来就像在跳跃。
Hibernate:
在我的项目中,我有以下Hibernate设置:
Company
这段代码创建了一个EmployeeList项的列表,我会将其返回并在我的AngularJS代码中处理。
我尝试过
额外信息
我的REST API版本如下:
Spring:
4.2.3.RELEASE
Hibernate: 4.3.11.Final
问题:在客户端应用程序中,我需要一个有序列表。当我从REST API请求列表时,列表几乎每次都以不同的方式排序。这非常令人烦恼,因为列表中的某些文本显示在屏幕上,现在看起来就像在跳跃。
Hibernate:
在我的项目中,我有以下Hibernate设置:
Company
@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@JsonBackReference
private Set<Employee> employees= new HashSet<Employee>();
员工
@NotNull
@Column(name = "companyId", nullable = false)
private int companyId;
一家公司可以有很多员工,但员工一次只能在一家公司工作。
Hibernate Repository
由于有人问我是否使用查询,这是我的存储库(使用Criteria /让Hibernate来完成工作):
public Employee findById(int id) {
Criteria criteria = getSession().createCriteria(Employee.class);
criteria.add(Restrictions.eq("id", id));
return (Employee) criteria.uniqueResult();
}
Spring
为了更好地处理数据,我正在使用序列化模型。我实现了以下内容(在我的 RestController 中):
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);
}
这段代码创建了一个EmployeeList项的列表,我会将其返回并在我的AngularJS代码中处理。
我尝试过
我尝试在Employee存储库(findById)中添加一个Criteria,但似乎Hibernate在通过外键获取表时不使用存储库。
尝试添加注释,但Hibernate不支持按顺序排序的注释。
额外信息
由于我使用懒加载(出于性能考虑),因此我在存储库中使用以下代码:
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;
}
我的问题
有没有办法告诉Hibernate通过公司实体来排序获取的员工列表?我知道我可以在代码中排序,但那对性能来说很糟糕。因此,如果Hibernate可以排序项目,那就太好了。
ID排序应该没问题。 如果我想要其他内容,我总是可以更改它。
有人知道如何在不影响性能的情况下实现这一点吗?
解决方案
Hibernate没有用于order by
的特定注释。 javax.persistence有一个用于排序的注释(@OrderBy()
)。 Hibernate检查此注释并对结果进行排序。
您需要使用ArrayList,以便保留顺序(答案如下)。
感谢Benjamin Bau提供的答案。