2015-12-07 171 views
3

我有一個REST API(Spring休息與休眠),這是我的所有數據的接入點。客戶端應用程序(Cordova和AngularJS)連接到此API以用於數據饋送。休眠訂單外鍵表

我的REST API的版本是:

春:4.2.3.RELEASE

休眠:4.3.11.Final


問題

在我需要一個有序列表中的客戶端應用程序。當我從REST API請求一個列表時,列表幾乎每次都有不同的排序。這很煩人,因爲列表中的一些文本顯示在屏幕上,現在看起來好像在跳轉。


休眠

在我的項目,我有以下休眠設置:

公司

@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做的工作):

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代碼返回和處理列表。


我試過

  • 我試圖在員工信息庫(findById)增加一個標準,但好像通過外鍵得到一個表時,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 byjavax.persistence確實有訂購註釋(@OrderBy())。 Hibernate檢查這個註解並命令結果。

您需要爲此使用ArrayList,以便保留順序(答案在下面)。

學分Benjamin Bau爲答案

+0

您可以將EmployeeList的HashSet更改爲TreeSet,但我敢打賭你知道嗎? –

+0

你的findByName(companyName)是什麼樣的?你在使用任何查詢嗎? –

回答

1

將@OrderBy註釋添加到您的員工。將字段從一個集合更改爲一個列表,以便保留順序。

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