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