Google app engine JPA查询返回列表<;org.datanucleus.store.types.sco.backed.ArrayList>;而是列出<;T>;

Google app engine JPA查询返回列表<;org.datanucleus.store.types.sco.backed.ArrayList>;而是列出<;T>;,google-app-engine,jpa,datanucleus,Google App Engine,Jpa,Datanucleus,我在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("

我在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);
    }
Query Query=entityManager.createQuery
(“从p处选择p.products,其中p.id=:id”);
query.setParameter(“Id”,Id);
List resultList=query.getResultList();
//用于调试目的
assert(resultList.get(0)产品实例);
如果(resultList.size()>0)
{
//在此处引发强制转换异常
产品p=resultList.get(0);
}

@实体
公共课场所{
私人收藏产品;
@OneToMany(级联=级联类型.ALL)
公共收藏产品(){
退货产品;
}
公共产品(收集产品){
这一点。产品=产品;
}
私有字符串id;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@扩展名(vendorName=“datanucleus”,key=“gae.encoded pk”,value=“true”)
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
}

类javadoc告诉我们它实现了
java.util.List
,所以它是一个有效的返回类型

请记住,规范中说,您得到的是一个
列表
作为返回类型,而不是
java.util.ArrayList
,因此实现
列表
的任何类都与其他类一样有效

更新:

尝试:


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

请记住,规范中说,您得到的是一个
列表
作为返回类型,而不是
java.util.ArrayList
,因此实现
列表
的任何类都与其他类一样有效

更新:

尝试:


我对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)

编辑: 您可以尝试以下代码

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

List<Products> products = place.getProducts();
Place-Place=entityManager.createQuery(“从p中选择p,其中p.id=:id”,Place.class).getSingleResult();
List products=place.getProducts();

另外,您使用的是JPA,但是
@Extension
似乎是JDO特有的注释。

我对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)

编辑: 您可以尝试以下代码

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

List<Products> products = place.getProducts();
Place-Place=entityManager.createQuery(“从p中选择p,其中p.id=:id”,Place.class).getSingleResult();
List products=place.getProducts();

另外,作为旁注,您使用的是JPA,但是
@Extension
似乎是JDO特定的注释。

当JPQL规范要求选择项应为

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

所以说这个问题是正确的答案是错误的。如果您想要一个位置的“产品”,那么您检索该位置,它就拥有产品。

当JPQL规范要求选择项应为空时,从JPQL查询中选择多值字段是非法的

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


所以说这个问题是正确的答案是错误的。如果你想要“产品”对于一个位置,您检索该位置,它就有了产品。

该类是否扩展了
列表
?@SJuan76该类实现了
列表
&扩展了一个类,该类再次扩展
数组列表
,该类是否扩展了
列表
?@SJuan76该类实现了
列表
&再次扩展了一个类扩展
Arraylist
对不起,我没有说明我的问题。。。我将再次编辑问题TNX,未尝试,但在GAE上您不能使用join,因此它可能不适用于我的环境抱歉,我没有说明我的问题。。。我将再次编辑问题TNX,没有尝试过,但在GAE上您不能使用join,因此它可能不适用于我的环境谢谢Nayan,我已经尝试过了,但是指定返回类会导致CastException…@Fabio相应地编辑了帖子,可能会帮助您了解使用getSingleResult()的技巧。关于@Extension annotation,有一个JPA对应项,以避免使用google数据存储密钥类型。谢谢Nayan,我已经尝试过了,但是指定返回类会导致CastException…@Fabio相应地编辑了帖子,可能会帮助您了解使用getSingleResult()的技巧。关于@Extension注释,有一个JPA对应项,以避免使用google数据存储密钥类型。感谢您的解释,这解决了我的问题。关于检索数据的方式,由于延迟加载,我认为对place.getProducts()的访问将导致对数据存储的另一个请求。因此,query.getSingleResult()可能是我的最佳选择。@DataNucleus该查询与JPA一起工作,可以直接选择产品实体,而无需查询Place实体,对DataNucleus不太确定。@Nayan,它是一个多值字段,所以不,它不是JPA规范的一部分。显然DataNucleus JPA通过JPA TCK。@DataNucleus我已经尝试过了,它成功了,直接获取子实体列表。@Nayan,我的评论很清楚。JPA规范没有定义对选择多值字段的支持。我甚至引用了规范的一部分。一些实现是否支持它是一个完全不同的问题谢谢你的解释,这解决了我的问题。关于检索数据的方式,由于延迟加载,我认为对place.getProducts()的访问将导致对数据存储的另一个请求。所以一个query.get