1

Google AppEngine で datanucleus を使用して親キーでデータを取得したいと考えています。JPAを使用しています。

これが私の Stock Bean (親) です。

@Entity
public class Stock implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @OneToMany(fetch=FetchType.LAZY, mappedBy="stock")
    private List<StockValue> stockValues;
}

これが私の StockValue Bean (子) です。

@Entity
public class StockValue implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @ManyToOne
    private Stock stock;
}

私は次のようにリクエストを実行しようとしました (クエリは datanucleus クエリです):

DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
Query queryStock = new Query("Stock");
queryStock.addFilter("name", FilterOperator.EQUAL, "toto");

PreparedQuery prepare = datastoreService.prepare(queryStock);
Entity asSingleEntity = prepare.asSingleEntity();

Query query = Query("StockValue", asSingleEntity.getKey());
prepare = datastoreService.prepare(query);

List<Entity> asList = prepare.asList(FetchOptions.Builder.withLimit(10));

そして、すべてそれでうまくいきます。しかし、私はエンティティを取得し、自分の Bean を使用したいと考えています。だから私はこれをやろうとしました(クエリはjavaxクエリです):

Query createQuery = entityManager.createQuery("SELECT p FROM Stock p WHERE p.name = \"toto\"");
Object singleResult = createQuery.getSingleResult();
Stock stockEntity = (Stock)singleResult;

createQuery = entityManager.createQuery("SELECT p FROM StockValue p WHERE p.key IS NOT null AND p.key.parentKey = :parentKey ");
createQuery.setParameter(":parentKey", stockEntity.getKey());
Object singleResult2 = createQuery.getSingleResult();

そして、ここに私の問題があります、私はこのエラーを受け取ります:

org.datanucleus.store.appengine.FatalNucleusUserException: SELECT FROM StockValue p WHERE p.key IS NOT null AND p.key.parentKey = :parentKey: Can only reference properties of a sub-object if the sub-object is embedded.

私はこれを理解していません。Bean 間の関係は良好に思えます。これを行うと、次のようになります。

stockEntity.getStockValues();

私はstockValuesを正しく取得します。リクエストが失敗するのはなぜですか?

ご協力いただきありがとうございます

4

1 に答える 1

3

簡単に言うと、GAEでは、1つのエンティティの種類内、またはJPA/JDOの用語では1つのクラス内でのみクエリを実行できます。StockValueとは2つの別個のクラスであり、したがって2つの別個のエンティティの種類であるためStock、それらを介してクエリを実行することはできません。

エラーが示すように、@Embeddedアノテーションを介して1つのクラスを別のクラスに埋め込んだかどうかを照会できます。この場合、2つのクラスがありますが、データストアには1つのエンティティの種類しかありません。

またkey.parentKey、実体関連とは何の関係もありません。「親」は、トランザクションのスコープを定義するために使用されるエンティティグループを定義するために使用されるGAEデータストアの概念です。

于 2012-09-05T20:00:35.380 に答える