5

Hibernate を使用してデータベースから行を取得する際に問題があります。1行だけ取得したい場合、20行を受け取ります。約1.5k行のテーブルからすべての行を取得したい場合、正確に15.2k行を受け取ります。このテーブルのエンティティ クラスには複合主キーがあります。

これは、すべての行を取得するための私のコードです:

Criteria criteria = getSession().createCriteria(type);
criteria.setCacheable(true).setCacheRegion(BaseEntity.PACKAGE);
criteria.list();

そして、これは私のエンティティクラスです:

@javax.persistence.Entity
@Table(name = "my_table")
public class My extends MyEntity<MyPK> {

    @EmbeddedId
    private MyPK id;

    @Column(name = "text", nullable = false)
    protected String text;

    @ManyToOne
    @JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
    protected Option option;

    @Override
    public MyPK getId() {
        return id;
    }

    @Override
    public void setId(MyPK id) {
        this.id = id;
    }

    //getters and setter
}

そして、これはMyPKクラスです:

@Embeddable
public class MyPK implements Serializable {

   @Column(name = "qwerty")
   protected String qwerty;

   @Column(name = "property")
   protected String property;

   //constructors, getters and setters
}

MyEntityクラスは@MappedSuperclass注釈付きの抽象クラスです。これは、このクラス ヘッダーです。

@MappedSuperclass
public abstract class MyEntity<T extends Serializable>

私は何を間違っていますか?この問題はEmbeddedIdですか?

編集#1 私が気づいたように、これはこれに問題があります:

@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;

このオブジェクトには、別のテーブルへの外部キーが含まれています。そして、この別のテーブルには別のテーブルへの参照があります。そして、この最後のテーブルには、前のテーブルの 10 行があります。その結果、行数 * 10 を取得しています。問題は、エンティティの Hibernate アノテーションにある可能性があります。

4

4 に答える 4

7

どこかで熱心に多対 1 の関係に参加しているようです。デフォルトの動作では、データベースから返される行ごとに 1 つのエンティティが取得されます。熱心なフェッチを変更したくないが、結果の重複を削除したい場合は、これを使用する必要がありますResultTransformer:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
于 2012-10-12T22:23:10.790 に答える
2

@Embeddableは、 MyPKの列がMyクラスの列になること を意味するだけMyPKの「プロパティ@ManyToOne @JoinColumn(name = "property")」 と同じであるために 問題が発生する可能性があります

于 2012-10-09T09:05:53.627 に答える
1

qwerty主キー クラスは、集計値 (ここではと) に関して equals() と hashCode() を定義する必要がありますproperty。ほとんどの場合、ResultSet を処理するときに、Hibernate が複数の行のエンティティ キーを同等と見なしていません。

JPA 2.0仕様のセクション2.4から(役立つ場合):

主キー クラスは equals および hashCode メソッドを定義する必要があります。これらのメソッドの値の等価性のセマンティクスは、キーがマップされるデータベース タイプのデータベースの等価性と一致している必要があります。

于 2012-10-09T13:44:22.870 に答える
1

このメソッドを使用して条件にこれを設定することにより、結果の最大数を設定できます: setMaxResults(int maxResults)

于 2012-10-09T08:54:11.497 に答える