我的假設是你有關聯到你的領域配置你提供一個Hibernate實體:
@Entity
@Table
public class FieldEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "FieldId")
private Long fieldId;
@Column(name = "FieldName")
private String fieldName;
@Column(name = "Type")
private String type;
}
的第一步是獲取自己根據您的需要,這是類型的實際數據行。您可以選擇讓數據庫爲您執行排序或在java代碼中自行執行。這取決於您的查詢的重用。我會告訴你們兩個。
排序使用Query
首先,下面標註添加到您的FieldEntity
類略低於@Table
。
@NamedQuery(
name = "FieldEntity.findByType",
query = "FROM FieldEntity e WHERE e.type = :type ORDER BY e.fieldId")
命名查詢是一個很大的特點,因爲它們是由ORM提供者通常在啓動時解析,通知您的任何查詢錯誤的,也減少了運行時的成本,因爲他們是預解析。
下一步是使用這個NamedQuery爲了從休眠獲得結果。
// construct a hibernate query using named query, specifying the type parameter.
Query query = session.getNamedQuery("FieldEntity.findByType").setString("type", type);
// Now iterate and capture results
List<FieldEntity> results = new ArrayList<>();
for(Object[] row : query.list()) {
FieldEntity e = row.get(0);
results.add(e);
}
一旦你有你的查詢(已經被FieldId
排序)的結果,這是一個簡單的迭代循環,並將它們添加到根據業務需求的地圖。這種類型的邏輯通常是我在業務用例類中看到的東西。
public Map<Long, String> getFieldEntityMapByType(String type) {
List<FieldEntity> results = // call DAO and get list.
Map<Long, String> map = new LinkedHashMap<>();
for(FieldEntity entity : results)
map.put(entity.getFieldId(), entity.getFieldName());
return map;
}
既然結果已經排序,我用一個LinkedHashMap
保留廣告訂單我遍歷結果集。
排序沒有查詢
在這種情況下,你的@NamedQuery
不包括ORDER BY子句,相反,我會用一個SortedMap
,而不是LinkedHashMap
和代碼保持不變。
SortedMap
確保條目根據字段ID的自然排序順序添加到地圖中。
結論
的好處後一種方法是你可以改變使用情況下的那種行爲,而不會影響數據庫訪問代碼,但成本的影響是,排序是在應用程序服務器的內存中完成。根據實體數量的不同,這對於大型結果集可能會產生問題。
前一種方法效果很好的更大的結果集,並可以通過使用基於標準的查詢,而不是命名查詢只是在查詢分析每個執行成本在運行時改變排列順序進行優化。