0

Hibernate の取得では空のリストが返されますが、データが入力されたリストが期待されます。2 つのオブジェクトが関係し、注釈によってマッピングが行われます。

@Entity
@Table(name = "parent")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private long id;
}

@Entity
@Table(name = "child")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Child {
    @ManyToOne
    @JoinColumn(name = "parentId")
    @OrderBy(value="id")
    private Parent parent;
}

実行されたクエリ:

String queryString = "select c from Child c where c.parent.id = ?1";
Query q = getEntityManager().createQuery(queryString);
q.setParameter("1", parentId);
return q.getResultList();

Hibernate がそのコード セットを実行すると、サイズ = 0 のリストが返されます。SQL ロギングをオンにして、MAMP のログで提供されるクエリを実行すると、期待される結果が返されます。何かアイデアはありますか?

4

3 に答える 3

2

これで問題が解決するはずです:

q.setParameter(1, parentId);

現在、クエリで名前付きパラメーターを設定するために呼び出しQuery.setParameter(String, Object)ていますが、クエリで位置パラメーターを使用しています。に変更するとQuery.setParameter(int, Object)、位置パラメーターが設定され、クエリが機能します。

于 2012-10-01T09:33:04.410 に答える
1

トランザクション管理が原因で問題が発生しました。Spring の @Transactional を使用して、トランザクションの管理方法を示しました。しかし、私たちの取引戦略のいくつかは間違っていました。

したがって、この問題に遭遇した人は、トランザクション ログをオンにして、トランザクションが期待どおりにコミットされるかどうかを確認する必要があります。まだコミットされていないトランザクションからデータにアクセスできないようにするため。

于 2012-10-30T09:10:31.617 に答える
0

このインポートの代わりに:

import javax.persistence.Query

これについて言及する必要があります:

import org.hibernate.Query
于 2012-10-01T12:50:29.380 に答える