gpt4 book ai didi

java - 从数据库中获取值作为有序映射

转载 作者:行者123 更新时间:2023-11-30 22:28:33 28 4
gpt4 key购买 nike

我正在处理业务需求,我需要获取两个字段值作为订单中的键/值对。我正在使用 mysql 和 hibernate 进行数据库操作。

我的表包含三个列(fieldId、FieldName、FieldType),其中 fieldId 作为主键。我的要求是获取 fieldIds 和 FieldNames 值作为基于 fieldType 的有序映射。

这是我的示例表数据。

FieldId  FieldName  Type
1 f1 x
2 f2 x
3 f3 x
4 f4 y

我想将所有 fieldIds 和 fieldNames 作为特定字段类型的 ascendingr(基于 fieldId)中的键值对说“x”。请帮我解决这个问题。

最佳答案

我的假设是您有一个与您提供的字段配置相关的 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 代码执行排序。这取决于您的查询的重用。我会给你们两个看。

按查询排序

首先,将以下注释添加到 @Table 下方的 FieldEntity 类中。

@NamedQuery(
name = "FieldEntity.findByType",
query = "FROM FieldEntity e WHERE e.type = :type ORDER BY e.fieldId")

命名查询是一项很棒的功能,因为它们通常在启动时由 ORM 提供程序解析,通知您任何查询错误,并且由于它们是预解析的,因此还降低了运行时成本。

下一步是使用此 NamedQuery 以从 hibernate 中获取结果。

// 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 排序),这是一个简单的迭代循环,并根据您的业务需求将它们添加到 map 中。这种类型的逻辑通常是我在业务用例类中看到的东西。

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 确保条目在添加到 map 时根据字段 ID 的自然排序顺序进行排序。

结论

后一种方法的好处是您可以根据用例更改排序行为而不影响数据库访问代码,但成本影响是排序是在应用程序服务器的内存中完成的。根据相关实体的数量,这可能会成为大型结果集的问题。

前一种方法适用于较大的结果集,并且可以通过使用基于条件的查询而不是命名查询来优化,以便在运行时更改排序顺序,只需以查询解析每次执行为代价。

关于java - 从数据库中获取值作为有序映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526585/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com