使用 Hibernate 从数据库获取列表并填充 Array/Hashmap
Obtaining Lists from Database and Populating Array/Hashmap Using Hibernate
作为我程序的一部分,我使用关系型 table 保存用户角色、工作类别等信息。每个 table 可能有略微不同的字段 - 例如:
用户角色 Table 具有以下字段:
- id (auto-generated)
- role (eg Planner, Admin etc)
- role_description (description of above role)
- enabled (toggle this role on/off)
职位类别Table:
- id (auto-generated)
- category (eg Service, Maintenance etc)
- category_description (description of above)
- category_group (categories are grouped into management areas)
- ...
- enabled (toggle category on/off)
列表可以由最终用户更改,因此我需要提供一个管理部分以允许添加新的 roles/categories。
我曾想过创建一个例程,在其中传递 role/category 等的实体 class 并让它生成一个数组,该数组可用于填充管理部分,但只能为前两列执行此操作 - 例如 id/role 或 id/category.
由于每个实体之间的字段不同,我有什么办法可以做到这一点吗?或者我必须在每个实体中创建一个方法 - 例如 getRoleList 和 getCategoryList 等?
谢谢。
经过一些试验,我决定按以下方式实施。
我已将方法添加到我的数据库助手 class 中,它将读取列表并填充一个数组。我必须为每个实体创建一个单独的方法,但由于 classes.
之间的差异,我认为这是必要的
我不是 100% 确定这是完成此操作的最有效方法,但它满足了我的需要(目前)。
方法之一:
public static UserRole[] getUserRoleList(String order, Boolean reverseOrder) throws SQLException {
Session session = openSession();
List<UserRole> list;
if (!reverseOrder) {
// obtain list and sort by provided field in ascending order
list = session.createCriteria(UserRole.class).addOrder(Order.asc(order)).list();
} else {
// sort descending
list = session.createCriteria(UserRole.class).addOrder(Order.desc(order)).list();
}
// return UserRole[]
return list.toArray((UserRole[]) Array.newInstance(UserRole.class, list.size()));
}
其余方法几乎相同(替换 entity/class 名称)。唯一的区别是为某些实体添加另一个参数(启用布尔值,因此我可以 return 仅列表中启用的项目)。
编辑:
自从发布以上内容后,我改变了主意,转而采用通用方法获取列表,传入实体 class,如下所示:
public static List getList(Class entity, String order, Boolean reverseOrder, Boolean enabled) {
// stripped for brevity...
list = session.createCriteria(entity)
.add(Restrictions.eq("enabled", true))
.addOrder(Order.asc(order)).list();
// stripped more...
return list;
}
调用方法时的转换:
List<User> userList = DatabaseHelper.getList(User.class);
作为我程序的一部分,我使用关系型 table 保存用户角色、工作类别等信息。每个 table 可能有略微不同的字段 - 例如:
用户角色 Table 具有以下字段:
- id (auto-generated)
- role (eg Planner, Admin etc)
- role_description (description of above role)
- enabled (toggle this role on/off)
职位类别Table:
- id (auto-generated)
- category (eg Service, Maintenance etc)
- category_description (description of above)
- category_group (categories are grouped into management areas)
- ...
- enabled (toggle category on/off)
列表可以由最终用户更改,因此我需要提供一个管理部分以允许添加新的 roles/categories。
我曾想过创建一个例程,在其中传递 role/category 等的实体 class 并让它生成一个数组,该数组可用于填充管理部分,但只能为前两列执行此操作 - 例如 id/role 或 id/category.
由于每个实体之间的字段不同,我有什么办法可以做到这一点吗?或者我必须在每个实体中创建一个方法 - 例如 getRoleList 和 getCategoryList 等?
谢谢。
经过一些试验,我决定按以下方式实施。
我已将方法添加到我的数据库助手 class 中,它将读取列表并填充一个数组。我必须为每个实体创建一个单独的方法,但由于 classes.
之间的差异,我认为这是必要的我不是 100% 确定这是完成此操作的最有效方法,但它满足了我的需要(目前)。
方法之一:
public static UserRole[] getUserRoleList(String order, Boolean reverseOrder) throws SQLException {
Session session = openSession();
List<UserRole> list;
if (!reverseOrder) {
// obtain list and sort by provided field in ascending order
list = session.createCriteria(UserRole.class).addOrder(Order.asc(order)).list();
} else {
// sort descending
list = session.createCriteria(UserRole.class).addOrder(Order.desc(order)).list();
}
// return UserRole[]
return list.toArray((UserRole[]) Array.newInstance(UserRole.class, list.size()));
}
其余方法几乎相同(替换 entity/class 名称)。唯一的区别是为某些实体添加另一个参数(启用布尔值,因此我可以 return 仅列表中启用的项目)。
编辑:
自从发布以上内容后,我改变了主意,转而采用通用方法获取列表,传入实体 class,如下所示:
public static List getList(Class entity, String order, Boolean reverseOrder, Boolean enabled) {
// stripped for brevity...
list = session.createCriteria(entity)
.add(Restrictions.eq("enabled", true))
.addOrder(Order.asc(order)).list();
// stripped more...
return list;
}
调用方法时的转换:
List<User> userList = DatabaseHelper.getList(User.class);