如何在java中将联接的结果集映射到对象?

如何在java中将联接的结果集映射到对象?,java,hibernate,jdbc,Java,Hibernate,Jdbc,我将示例从映射ResultSet到一个对象,效果很好,但后来我意识到一个问题,我无法从连接查询映射ResultSet。例如,我有两个表,usr和vehicle。我执行选择查询并将这两个查询连接起来 public class Usr { public int id; public Vehicle vehicle; } public class Vehicle { public int id; public int year; public String m

我将示例从映射
ResultSet
到一个
对象
,效果很好,但后来我意识到一个问题,我无法从连接查询映射
ResultSet
。例如,我有两个表,
usr
vehicle
。我执行
选择
查询并将这两个查询连接起来

public class Usr {
    public int id;
    public Vehicle vehicle;
}

public class Vehicle {
    public int id;
    public int year;
    public String model;
    public int user_id;
}
如何将
ResultSet
映射到
Usr
对象?我在谷歌上搜索了一下,发现
SqlResultSetMapping
可能是一个解决方案,但采用Hibernate似乎需要做很多工作,我只熟悉纯
Java
。从这个例子来看,我需要重写所有的查询语句,并将我的数据库结构放在
Java

有没有其他方法可以将连接的
ResultSet
映射到一个对象,而不会对当前代码造成太多混乱

已编辑

查询是这样的

select * from usr join vehicle on usr.id = vehicle.user_id;

我想把它映射回
Usr
对象

让我们用一种新的方式来打破这一切。您所遵循的方法很方便,但也有局限性。它只处理字段的基本类型。但是,作为外键映射与数据库中的其他对象或表关联的类呢?与您拥有的
Usr
类类似,在该类中,
Vehicle
作为关联关系

您可以在类中编写映射逻辑,然后在必要时重用它,而不是以过于通用的方式进行映射

编写一个
RowMapper
抽象类

public abstract class RowMapper<E> {

    public List<E> processResultSet(ResultSet rs) throws SQLException {
         List<E> objectList = new ArrayList<>();

         while(rs.next()) {
            objectList.add(mapRow(rs));
         }

         return objectList;
    }

    abstract E mapRow(ResultSet rs) throws SQLException;
}
您还可以为
车辆
实现另一个行映射器。现在它只是一种使用它的方式

假设您从以下连接查询中获得了结果集

select usr.id, vehicle.id, vehicle.year, vehicle.model from usr join vehicle on usr.id = vehicle.user_id;
现在

UsrMapper-UsrMapper=new-UsrMapper();
List usrList=usrMapper.processResultSet(resultSet);

是的,这是可能的,但是您没有说您正在使用的连接查询的确切内容,以及您希望如何将结果集映射到哪个类?该示例解释了一个简单的手动映射,这几乎没有什么用处。在直接使用JDBC和使用Hibernate之间已经走了一半。如果您想处理许多复杂的映射,可以学习Hibernate。如果您希望手动处理事情,请在没有该示例帮助的情况下正常处理。或者更好的是,找到一个只进行映射的框架并使用它。你能提供一个用于从结果集中检索
Usr
的查询吗?这就像是
select*from usr
一样,您现有的代码可以进行映射吗?谢谢您的回答。我应该在我的问题中提到它。我真正想要的是一个通用的映射器方法,它可以像示例中那样处理所有映射。有可能吗?有。这也是可能的。但我恐怕这不是直截了当的。您需要从某种注释中检查实体和解析映射逻辑之间的不同类型的关系。但是为什么你要重新发明轮子呢?标准的ORM框架已经存在,可以有效地完成这项工作。如果只是因为您只想坚持使用纯java,那么这个行映射器模式可能会更方便。我想我会选择这个模式,然后在有时间的时候实现Hibernate。希望到那时这个项目不会太大。如果没有
选择vehicle.id作为“vehicle.id”
,它能工作吗。因为你需要一些方法从resutset中找到准确的列。您可以通过提及
columnIndex
columnLabel
select usr.id, vehicle.id, vehicle.year, vehicle.model from usr join vehicle on usr.id = vehicle.user_id;
UsrMapper usrMapper = new UsrMapper();
List<Usr> usrList = usrMapper.processResultSet(resultSet);