Java:将结果集从JPA Paginated Query设置为自定义类

时间:2013-11-19 12:23:16

标签: java jpa arraylist resultset

以下是该方案。

我正在尝试获取资源层中的记录列表。它有以下代码;

PagedResponse<Person> pagedResponse= new PagedResponse<Person>();

对业务实施的调用为

pagedResponse = facadeLocator.getPersonFacade().findAllRecords(getUserId(), fromrow, maxrows);

现在,在Business实现中,我将命名查询用作;

Query query = getNamedQuery("Person.findAll");

我的回复是

pagedResponse = executePagedQuery(query, firstResults, maxResults);

在executePagedQuery()里面,我有;

List resultList = query.getResultList();

返回的响应pagedResponse是自定义类型的PagedResponse类,有2个成员;

private Long totalRecords;
    private List<T> records;

现在在我的Person课程中,我有

@NamedQuery(name = "Person.findAll", query = "Select DISTINCT(p.personName), p.personAge, p.personGender from Person p where p.personAge = :personAge")

现在这是运行时发生的事情。

我将“记录”视为矢量,成员为

[0] = Object[]
[1] = Object[]

回到资源层,我想迭代响应并将其设置在列表中

List<Person> personList = new ArrayList<Person>();

那么我有哪些选择。

我尝试过做

    for(Object[] person: pagedResponse.getRecords()) {
                Person p = new Person();
                p.setPersonName((String)person[0]);
// Setting other values
    personList.add(p);
    }

但它表示该行的不兼容类型

for(Object[] person: pagedResponse.getRecords()) {

只是添加,当我的查询没有返回选择列而是返回所有列时,我没有遇到任何不兼容的类型问题;

query = "SELECT p FROM Person p WHERE 

所以我有2个问题;

1. Why was there no type casting issues when I was returning all the columns using the named query (It showed the type as "Person" and not generic type as showing after using the named query with specific columns)
2. Using the query with specific columns, what is the right approach to set the values returned from the query in the resource layer ?

1 个答案:

答案 0 :(得分:1)

具有许多单独SELECT ed值的查询应该返回列表列表。也许你想用适当的构造函数定义一个bean:

package com.foo;

public class PersonData {
    private String name;
    private int age;
    private Sex gender;

    public PersonData(String name, int age, Sex gender) {
        this.name = name;
        this.age= age;
        this.gender = gender;
    }

    // getters/setters
}

将查询运行为:

SELECT NEW com.foo.PersonData(DISTINCT(p.personName), p.personAge, p.personGender)
FROM Person p WHERE p.personAge = :personAge

现在getResultList()应该返回PersonData个对象的列表。虽然我没有使用嵌套的new PersonData(DISTINCT(...))语法...