Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数据库中获取值作为有序映射_Java_Mysql_Hibernate_Jdbc_Collections - Fatal编程技术网

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

Java 从数据库中获取值作为有序映射,java,mysql,hibernate,jdbc,collections,Java,Mysql,Hibernate,Jdbc,Collections,我正在处理业务需求,需要按顺序获取两个字段值作为键/值对。我正在使用mysql和hibernate进行db操作 我的表包含三个列(fieldId、FieldName、FieldType),其中fieldId作为主键。我的要求是根据fieldType以有序映射的形式获取FieldID和FieldName值 这是我的示例表数据 FieldId FieldName Type 1 f1 x 2 f2 x 3 f3

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

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

这是我的示例表数据

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

我想让所有字段ID和字段名作为ascendingr中的键值对(基于字段ID),用于特定的字段类型,比如“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代码进行排序。这取决于查询的重用。我给你们两个看

使用查询进行排序

首先,将以下注释添加到
下方的
字段实体
类中

@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);
}
由于结果已经排序,我使用
LinkedHashMap
在迭代结果集时保留插入顺序

无查询排序

在这种情况下,您的
@NamedQuery
将不包含ORDERBY子句,相反,我将使用
SortedMap
而不是
LinkedHashMap
,代码保持不变

SortedMap
确保条目在添加到地图时根据字段ID的自然排序顺序进行排序

结论

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


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

我的假设是您有一个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代码进行排序。这取决于查询的重用。我给你们两个看

使用查询进行排序

首先,将以下注释添加到
下方的
字段实体
类中

@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);
}
由于结果已经排序,我使用
LinkedHashMap
在迭代结果集时保留插入顺序

无查询排序

在这种情况下,您的
@NamedQuery
将不包含ORDERBY子句,相反,我将使用
SortedMap
而不是
LinkedHashMap
,代码保持不变

SortedMap
确保条目在添加到地图时根据字段ID的自然排序顺序进行排序

结论

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

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