如何将结果集的多个值获取到 Java 对象中

Posted

技术标签:

【中文标题】如何将结果集的多个值获取到 Java 对象中【英文标题】:How to get ResulSet multiple values into Java objects 【发布时间】:2021-08-19 11:58:08 【问题描述】:

我有 2 个表 Person (Person_id, name)Address(Address_id, Person_idAd, addressName) 一对多关系。

通过以下查询我得到

String query = "SELECT Person_id, addressName from Person, Address where Person_id = Person_idAd"
        
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) 
        

Person_id addressName
1001 Address-1
1001 Address-2
1002 Address-1

我想将此条目映射到 Java 对象中。

class Person 
    int id;
    ArrayList<String> addresses;
    // get and set...

请告诉我该怎么做。 谢谢。

【问题讨论】:

今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。 【参考方案1】:

首先,将ORDER BY Person_id 添加到 [SQL] 查询中。 此外,您的 [SQL] 查询应使用 JOIN。

select P.PERSON_ID, A.ADDRESSNAME
  from PERSON P
  join ADDRESS A
    on P.PERSON_ID = A.PERSON_IDAD
 order by P.PERSON_ID

每当PERSON_ID 更改时,创建一个新的Person 对象并设置id 成员。 虽然PERSON_ID 保持不变,但将所有地址收集到java.util.List。 您可能还希望另一个java.util.List 来容纳所有人。

java.util.List<Person> people = new java.util.ArrayList<>();
int currentId = 0; // Assuming there is no such ID.
int id;
Person person = null;
java.util.List<String> addresses;
while (rs.next()) 
    id = rs.getInt(1);
    if (id != currentId) 
        if (person != null) 
            person.setAddresses(addresses);
            people.add(person);
        
        person = new Person();
        person.setId(id);
        currentId = id;
        addresses = new java.util.ArrayList<>();
    
    addresses.add(rs.getString(2));

// Add the last person.
if (person != null) 
    person.setAddresses(addresses);
    people.add(person);

当然,作为替代方案,如果相关,您可以使用 Object Relational Mapping (ORM) 工具,例如 Hibernate。

【讨论】:

【参考方案2】:

你需要在while内构建类似这样的对象

Person person = null;
List<String> addrList = new ArrayList<String>();
while (rs.next()) 
int id = rs.getXXX() //you will personid 

if(person==null) 
   person = new Person();
   person.setId(id);
   addrList.add(rs.getXXX);
   person.setAddresses(addrList);
 else if(id!=person.getId()) 
  person = new Person();
   person.setId(id);
   addrList.add(rs.getXXX);
   person.setAddresses(addrList);


【讨论】:

以上是关于如何将结果集的多个值获取到 Java 对象中的主要内容,如果未能解决你的问题,请参考以下文章

JAVA获取ORACLE存储过程返回结果集的问题

如何将单个结果集从返回多个集的 SQL 存储过程保存到临时表?

Atitti dbutil获取多个返回结果集的解决

Asp.net(C#) 获取 执行sql server 语句/存储过程后的 多个返回值?

如何在 SQL 查询中获取结果集的字节大小?

实体框架 - 具有多个结果集的存储过程 - 没有行返回