0

私は GAE で JPA を使用しており、このクエリは 1 つの要素を含むリストを返します。この要素は org.datanucleus.store.types.sco.backed.ArrayList であり (最終的に結果が含まれています)、製品のリストを期待しています。私が間違っていることは何ですか?事前にサンクス!

Query query = entityManager.createQuery
             ("select p.products from Place p where p.id = :Id" );
query.setParameter("Id",id);
    List<Product> resultList = query.getResultList();
    //for debugging purpose
    assert (resultList.get(0) instanceof Product);
    if (resultList.size() > 0)
    {
        //raise a cast exception here
        Product p = resultList.get(0);
    }

@Entity
public class Place {

    private Collection<Product> products;
    @OneToMany(cascade = CascadeType.ALL)
    public Collection<Product> getProducts() {
        return products;
    }

    public void setProducts(Collection<Product> products) {
        this.products = products;
    }

    private String id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}
4

3 に答える 3

2

JPQL仕様で、選択項目を次のように指定している場合、JPQLクエリから複数値のフィールドを選択することは違法です。

"single_valued_path_expression | scalar_expression | aggregate_expression | 
    identification_variable | OBJECT(identification_variable) | constructor_expression"

したがって、このクエリが正しいという答えは間違っています。プレイスの「商品」が必要な場合は、プレイスを取得すると商品が含まれます。

于 2012-11-07T12:13:13.033 に答える
1

私はDataNucleusにあまり詳しくないので、実行していません。ただし、JPAを使用すると、クエリは正常に機能するはずです。以下のコードを試して、指定されたクラスに従って結果を返すクエリを作成できます。

entityManager.createQuery("SELECT p.products FROM Place p WHERE p.id = :Id", Product.class);

ドキュメントから:

<T> TypedQuery<T> createQuery(java.lang.String qlString,
                                      java.lang.Class<T> resultClass)

JavaPersistenceクエリ言語ステートメントを実行するためのTypedQueryのインスタンスを作成します。クエリの選択リストには、resultClass引数で指定されたタイプに割り当て可能な単一のアイテムのみが含まれている必要があります。

Parameters:
         qlString - a Java Persistence query string
         resultClass - the type of the query result

編集: 次のコードを試すことができます。

Place place = entityManager.createQuery("SELECT p FROM Place p WHERE p.id = :Id", Place.class).getSingleResult();

List<Products> products = place.getProducts();

また、補足として、JPAを使用していますが、@ExtensionJDO固有のアノテーションのようです。

于 2012-11-05T07:53:11.993 に答える
0

そのクラス javadoc は、それが を実装していることを示しているjava.util.Listため、有効な戻り値の型です。

仕様では、Lista ではなく a を戻り値の型として取得すると記載されているjava.util.ArrayListため、実装するクラスListはすべて他のクラスと同様に有効です。

アップデート:

試す:

 SELECT pr FROM Place pl INNER JOIN pl.products pr WHERE pl.id = :Id
于 2012-11-03T18:27:05.740 に答える