使用动态或语句进行Hibernate critieria查询

时间:2015-05-12 18:23:29

标签: java mysql hibernate criteria

我正在用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);
            }
        }

我该怎么办?我不想为每个位置迭代整个数据库,但我无法找到一种方法来处理或声明中的动态数值。

0 个答案:

没有答案