【问题标题】:Fetching values as ordered map from database从数据库中获取值作为有序映射
【发布时间】:2016-04-04 06:06:31
【问题描述】:

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

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

这是我的示例表数据。

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

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

【问题讨论】:

    标签: java mysql hibernate jdbc collections


    【解决方案1】:

    我的假设是您有一个与您提供的字段配置相关的 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 的自然排序顺序进行排序。

    结论

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 2011-09-21
      • 2015-03-03
      • 2013-12-05
      • 2021-12-12
      • 2022-07-21
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      相关资源
      最近更新 更多