Java 从数据库中获取值作为有序映射
我正在处理业务需求,需要按顺序获取两个字段值作为键/值对。我正在使用mysql和hibernate进行db操作 我的表包含三个列(fieldId、FieldName、FieldType),其中fieldId作为主键。我的要求是根据fieldType以有序映射的形式获取FieldID和FieldName值 这是我的示例表数据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
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的自然排序顺序进行排序
结论
后一种方法的好处是,您可以按用例改变排序行为,而不会影响数据库访问代码,但成本影响是排序是在应用程序服务器的内存中完成的。根据所涉及实体的数量,这可能会对大型结果集产生问题
前一种方法适用于较大的结果集,可以通过使用基于条件的查询(而不是命名查询)在运行时更改排序顺序进行优化,只需以每次执行查询解析为代价