我使用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 "
)
答案 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());
}