1

私は本当に愚かであるに違いありませんが、MyEclipse 7.5を使用して、JPAの問題で終わりを告げています。

JPAを介して(AS400上の)DB2データベースにアクセスしています。DAOにいくつかの正確な「検索」メソッドを提供するために、単純なテーブルをリバースエンジニアリングしました。ここまでは順調ですね。

このようにテーブルに対してSELECTステートメントを実行すると、4つの行が得られます。

SELECT * FROM MyTable WHERE MyValue = '1234'

ただし、JPAを介してこれらの同じ4つのレコードにアクセスしようとすると、適切なサイズ(4)のリストが表示されますが、すべて同じである4つのオブジェクトが含まれ、最初のオブジェクトのすべてのコピーが見つかりました。

List <MyTableObject> objects = dao.findByMyValue("1234");

これは、DAOクラスが作成する内部Queryオブジェクトがデータの行を反復処理できないかのようです。reveng.xmlファイルを無数の方法で微調整し、生成されたDAOをいじくり回しましたが、どこにも行きません。私はここで本当に明白な何かを逃していますか?従来のSELECTステートメントが結果セットを返すのと同じ方法でオブジェクトのリストを取得したいだけです!

(これは、Hibernate3.2とそれに関連するJPAライブラリを使用するMyEclipse7.5です)。

更新:findByMyValue()が渡す生成されたコードは次のとおりです(わかりやすくするためにloggin / try-catchは削除されています):

    @SuppressWarnings("unchecked")
public List<PolicyStatFile> findByProperty(String propertyName, final Object value)
{
    final String queryString = "select model from MyTableObject model where model." + propertyName + "= :propertyValue";
    Query query = getEntityManager().createQuery(queryString);
    query.setParameter("propertyValue", value);
    return query.getResultList();
}

最終更新 それはすべてモデルに関するものでした。この投稿へのコメントを参照してください。基本的に、リバースエンジニアリングファイルから生成されたモデルは、本当に一意のキーがなかったため無効でした。私がこれを解決すると(ここのコメントに拍車がかかりました)、すべてが順調でした。

4

2 に答える 2

1

オーバーライドされておらず、JPAエンティティ(MyTableObjectなど)にhashCode()あるequals()と思われます。そのため、Hibernateは返される行を区別できません。ここを見てください。

于 2009-09-28T16:41:15.227 に答える
1

投稿したメソッドは正しいように見えます (ただし、すべてのプロパティに対してこれを生成するのは無意味に思えます)。いくつかの確認事項:

  1. あなたが言及した MyValue プロパティは、エンティティに直接マップされていますか (たとえば、同じテーブルの列に関連付けられていません)?
  2. Hibernate SQL デバッグを有効にして (設定で「hibernate.show_sql」プロパティを true に設定)、生成されたクエリがどのように見えるかを確認できますか?
  3. 返される 4 つのオブジェクトは実際には同じですか (たとえば、互いに「==」であるなど)、それとも互いのコピーですか (たとえば、同じプロパティ値を持っているなど)?

問題のエンティティと上記の #2 から生成された SQL のマッピングを投稿できますか?

于 2009-09-29T00:26:36.297 に答える