JPA query.getResultList()?

时间:2014-01-03 10:15:39

标签: java java-ee jpa persistence

我使用JPA 1.0:

Query query;
            query = em.createNamedQuery("getThresholdParameters");
            query.setParameter(1, Integer.parseInt(circleId));

            List<Object[]> resultList = new ArrayList();
            resultList  = query.getResultList();

这里我得到的结果为List<Object[]>,因此我必须键入将行的所有参数转换为各自的类型,这很麻烦。

在JPA 2.0中,有TypedQuery返回类型为1的实体对象。

但是当我使用JPA 1时,我无法使用它。

如何将结果作为我想要的实体对象?

修改 QUERY

@Entity
@Table(name="GMA_THRESHOLD_PARAMETERS")
@NamedQuery(

        name = "getThresholdParameters",

        query = "select gmaTh.minNumberOc, gmaTh.minDurationOc, gmaTh.maxNumberIc, gmaTh.maxDurationIc, gmaTh.maxNumberCellId,"
                + "gmaTh.distinctBnumberRatio, gmaTh.minPercentDistinctBnumber from GmaThresholdParameter gmaTh " 
                + "where gmaTh.id.circleId=?1 AND gmaTh.id.tspId=?2 AND gmaTh.id.flag=?3 "
        )

4 个答案:

答案 0 :(得分:1)

您的查询会选择许多字段。这样的查询总是返回Object数组的列表。如果需要包含GmaThresholdParameter实体实例的列表,则查询应为

select gmaTh from GmaThresholdParameter gmaTh 
where gmaTh.id.circleId=?1 AND gmaTh.id.tspId=?2 AND gmaTh.id.flag=?3

获取实体列表的代码将是

List<GmaThresholdParameter> resultList = query.getResultList();

您将从编译器获得类型安全警告,您可以忽略它。

答案 1 :(得分:1)

我不能回复这个评论,所以我会继续做出回答。

List<Object[]> resultList = new ArrayList(); // CREATE an empty ArrayList object
resultList  = query.getResultList(); // getResultList ALSO returns its own ArrayList object

由于您将getResultList()返回的列表分配给您自己的空ArrayList所使用的相同变量,因此您的应用程序将丢失与您自己的空ArrayList的任何连接,Java会将其作为垃圾收集。基本上你创造它绝对没有目的。

JB Nizet发布的内容已足够。

List<GmaThresholdParameter> resultList = query.getResultList();

答案 2 :(得分:0)

当时我使用JPA 1时,我做了类似的事情:

    final Collection<YourType> typedResult = new ArrayList<YourType> 
    for(final Object result : query.getResultList()) 
    { 
         typedResult.add((YourType) result); 
    }  
    return typedResult; 

答案 3 :(得分:-1)

 List<GmaThresholdParamerter> result= query.getResultList();
   for( GmaThresholdParamerter res : result)
   {
     System.out.println("" +res.getMinNumberOc());
     System.out.println("" +res.getMinDurationOc());
  }