【问题标题】:Java : Set result set from JPA Paginated Query to custom classJava:将结果集从 JPA 分页查询设置为自定义类
【发布时间】:2013-12-03 00:02:21
【问题描述】:

这里是场景。

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

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

有一个业务实现调用

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

现在在业务实现中,我使用命名查询作为;

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")

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

我将“记录”作为Vector,成员作为

[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 ?

【问题讨论】:

    标签: java jpa arraylist resultset


    【解决方案1】:

    具有许多单独的SELECTed 值的查询应该返回一个列表列表。也许你想用适当的构造函数定义一个 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(...)) 语法...

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2012-10-12
      • 1970-01-01
      • 2016-09-22
      • 2016-05-23
      相关资源
      最近更新 更多