我有一个REST API(带有Hibernate的Spring REST ),它是我所有数据的访问点。客户端应用程序( Cordova和AngularJS )连接到此API以获取数据Feed。
REST API中的我的版本是:
春天:4.2.3.RELEASE
Hibernate:4.3.11.Final
问题
在客户端应用程序中,我需要一个有序列表。当我从REST API请求列表时,几乎每次都对列表进行不同的排序。这非常令人讨厌,因为列表中的某些文字会显示在屏幕上,现在看起来似乎正在四处跳跃。
休眠
在我的项目中,我有以下Hibernate设置:
公司
@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存储库
由于问题我是否使用查询,这里是我的存储库(使用Criteria /让hibernate完成工作):
public Employee findById(int id) {
Criteria criteria = getSession().createCriteria(Employee.class);
criteria.add(Restrictions.eq("id", id));
return (Employee) criteria.uniqueResult();
}
弹簧
为了更好的数据处理,我正在使用序列化模型。我按如下方式实现了这个(在我的 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没有对order by的注释支持。
额外信息
由于我使用LAZY加载(出于性能原因),我在我的存储库中使用以下代码:
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的答案 。
答案 0 :(得分:2)
将@OrderBy注释添加到您的员工。将字段从集合更改为列表,以便保留顺序。
@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@OrderBy("id")
@JsonBackReference
private List<Employee> employees = new ArrayList<Employee>();