我正在用Hibernate Criteria编写一个查询。我正在尝试查找与特定位置相关联的实体。每个位置可以包括国家,省,城市,经度和纬度。每个位置将作为不同的对象存储在数据库中,具体取决于使用的字段数。例如,country可以是一个国家/地区对象,其中所有字段都是null,还有省级对象,其中country和province字段已填充,但其他所有字段都为null。
当用户登录应用程序时确定其位置。因此,与用户相关联的位置对象的数量将是动态的,这取决于它们的位置。例如,数据库中可能没有适合该城市的位置对象。
我已为与用户关联的位置创建了条件。这工作正常....(下面的示例代码)
Criteria locationCriteria = session.createCriteria(Location.class);
locationCriteria.add(Restrictions.and(
Restrictions.or(
Restrictions.isNull("province"),
Restrictions.eq("province", province)
),
Restrictions.or(
Restrictions.isNull("country"),
Restrictions.eq("country", country)
)
));
还有一个数据库表,其中包含与位置具有manyToMany关系的实体。最终,我试图找到与登录用户关联的所有位置相关联的所有实体。现在的问题是我需要使用动态大小的位置criteria.list()作为限制来获取与每个位置相关联的实体。由于列表是动态的,我不能使用Restrictions.or()作为位置。
我正在考虑迭代来自locationCriteria.list()的每个值并为每个实体重新创建查询,但我担心随着数据库大小的增长而产生的性能。我现在已经实现了它,它正在工作(见下文)。
for (int i = 0; i < locationCriteria.list().size(); i++) {
Criteria criteria = session.createCriteria(Entity.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.createAlias("locations", "locations");
Location l = (Location) locationCriteria.list().get(i);
criteria.add(Restrictions.eq("locations.id", l.getId()));
criteria.add(Restrictions.eq(availability, true));
criteria.add(Restrictions.eq("active", true));
try {
criteria.add(Restrictions.or(
Restrictions.isNull("startDate"),
Restrictions.le("startDate", dateFormat.parse(dateFormat.format(date)))
));
} catch (ParseException p) {
p.printStackTrace();
}
try {
criteria.add(Restrictions.or(
Restrictions.isNull("endDate"),
Restrictions.ge("endDate", dateFormat.parse(dateFormat.format(date)))
));
} catch (ParseException p) {
p.printStackTrace();
}
for (Object ob : criteria.list()) {
Entity entity = (Entity) ob;
EntityModel pm = new EntityModel(entity);
entityModels.add(pm);
}
}
我该怎么办?我不想为每个位置迭代整个数据库,但我无法找到一种方法来处理或声明中的动态数值。