2

休止状態 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 の取得に問題がありますか? 誰かがこれについて知っているなら、私に知らせてください。

BeanStructre :

ドキュメント.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 にもう 1 つのフィールドを配置し、activitySchedules を除くメタデータをフェッチすると、適切なデータが取得されます。

4

1 に答える 1

7

setMaxResults()実行された SQL クエリからの JDBC 結果セットから返される行数を制限します。Criteria クエリから返されるオブジェクトの数は制限されません。

結合フェッチを使用しない単純な要求の場合、2 つの数値は同じです。しかし、toMany アソシエーションで結合フェッチを使用するクエリの場合、数値はそうではありません。たとえば、ドキュメントに 2 つのスケジュールがあり、これらのスケジュールのそれぞれに 3 つのアクティビティがある場合、クエリはこの 1 つのドキュメントに対して 6 つの JDBC 行を返します。したがって、 を呼び出すとsetMaxResults(4)、クエリから不完全なドキュメントが 1 つだけ取得されます。

setMaxResults()このようなクエリでは使用しないでください。回避策は、ドキュメントの ID のみを返すクエリを実行し、setMaxResults()このクエリに適用することです。10 個の ID を取得したら、フェッチ結合を使用して 2 番目のクエリを実行し、これらの 10 個の ID のいずれかを持つドキュメントを返します ( where document.id in (:documentIds))。

于 2012-06-26T07:30:07.387 に答える