Hibernate:SetMaxResults不使用java.util.Map

时间:2012-06-26 06:53:23

标签: java hibernate hashmap

我正在使用Hibernate 3.0。以下是为获取数据而编写的标准。

1. Criteria criteria = session.createCriteria(Document.class);
2. criteria.setMaxResults(10);
3. criteria.setFetchMode("metadata",FetchMode.join);
4. criteria.setFetchMode("activitySchedules", FetchMode.JOIN);
5. criteria.setFetchMode("activitySchedules.activities",FetchMode.JOIN); 
6. criteria.setResultTransformer(criteria.DISTINCT_ROOT_PROPERTY);
7. criteria.list();

在此条件中, setMaxResults(10)无效。对于定义的10个限制,它只给出1个结果。对于20,它同样给予2。如果我评论第4行,结果将以适当的方式进行。我没有得到这种奇怪的行为。是抓取MAP的问题吗?如果有人知道这件事,请告诉我。

BeanStrucutre:

Document.java

private NormMaster metadata;

private Map<TransactionFlowEnum, ActivitySchedule> activitySchedules;

 public NormMaster getMetadata(){
         return metadata;
}

public void setMetadata(NormMaster metadata){
   this.metadata = metadata;
}

public Map<TransactionFlowEnum, ActivitySchedule> getActivitySchedules() {
        return activitySchedules;
    }

 public void setActivitySchedules(
        Map<TransactionFlowEnum, ActivitySchedule> activitySchedules) {
        this.activitySchedules = activitySchedules;
    }

ActivitySchedule.java

private List<Stage> activities;

public List<Stage> getActivities() {
    return activities;
}

public void setActivities(List<Stage> activities) {
    this.activities = activities;
}

NormMaster.java

private String name;

public void setName(String name){
 this.name = name;
}

public return getName(){
 return name;
}

编辑:如果我在Document.java中添加一个字段并获取不包含activitySchedules的元数据,那么正确的数据即将到来。

1 个答案:

答案 0 :(得分:7)

setMaxResults()限制从执行的SQL查询中返回的JDBC结果集返回的行数。它不限制从Criteria查询返回的对象数。

对于没有任何连接提取的简单请求,这两个数字是相同的。但对于在toMany关联上使用连接提取的查询,数字不是。例如,如果文档有2个计划,并且每个计划都有3个活动,则查询将为此单个文档返回6个JDBC行。因此,如果您致电setMaxResults(4),您将从查询中获取一份不完整的文档。

setMaxResults()不应与此类查询一起使用。解决方法包括执行仅返回文档ID的查询,并对此查询应用setMaxResults()。获得10个ID后,使用提取连接执行第二个查询,返回具有这10个ID之一的文档(where document.id in (:documentIds))。