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)

创建 TypedQuery 的实例以执行 Java Persistence 查询语言语句。查询的选择列表必须只包含一个项目,该项目必须可分配给由 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,但@Extension似乎是 JDO 特定的注释。

于 2012-11-05T07:53:11.993 回答
0

该类 javadoc 告诉它实现java.util.List了 ,因此它是一个有效的返回类型。

请记住,规范说您将 aList作为返回类型,而不是 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 回答