- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 REST API(带 Hibernate 的 Spring REST),它是我所有数据的访问点。客户端应用程序(Cordova 和 AngularJS)连接到此 API 以获取数据馈送。
我在 REST API 中的版本是:
Spring :4.2.3.RELEASE
hibernate :4.3.11.Final
问题
在客户端应用程序中,我需要一个有序列表。当我从 REST API 请求列表时,列表几乎每次都以不同的方式排序。这很烦人,因为列表中的一些文本显示在屏幕上,现在看起来好像在跳来跳去。
hibernate
在我的项目中,我有以下 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();
}
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) 中添加一个条件,但 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。
最佳答案
为您的员工添加@OrderBy 注释。将字段从集合更改为列表,以便保留顺序。
@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@OrderBy("id")
@JsonBackReference
private List<Employee> employees = new ArrayList<Employee>();
关于java - Hibernate 命令外键表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34138106/
我是一名优秀的程序员,十分优秀!