我的假设是您有一个与您提供的字段配置相关的 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 代码中自己执行。这取决于查询的重用。我会告诉你两个。
按查询排序
首先,将以下注释添加到您的 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 的自然排序顺序进行排序。
结论
后一种方法的好处是您可以按用例更改排序行为,而不会影响数据库访问代码,但成本影响是排序是在应用程序服务器的内存中完成的。根据相关实体的数量,这可能会在结果集较大时出现问题。
前一种方法在较大的结果集上效果很好,并且可以通过使用基于条件的查询而不是命名查询来优化,以便在运行时更改排序顺序,而代价是每次执行时都会解析查询。