Hibernate排序外键表

3
我有一个REST API(使用 Spring REST with Hibernate ),它是我所有数据的访问点。客户端应用程序( Cordova and AngularJS )连接到此API以获取数据源。
我的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提供的答案


你可以将EmployeeList的HashSet更改为TreeSet,但我打赌你已经知道了? - Rafał P
你的findByName(companyName)是什么样子的?你使用了任何查询吗? - Rana_S
1个回答

2

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接