当前位置: 首页 > 知识库问答 >
问题:

将域对象映射到结果集而不是表

令狐和裕
2023-03-14

我正在开发一个使用现有数据库的应用程序,该数据库只能通过存储过程访问。这些SP中的大多数返回来自多个表的列。

我们有一个数据访问层,它从我们的域对象层返回类型的对象。但是,由于SPs返回来自多个表的列,我不确定应该如何构建我的域对象,因为它们中的大多数不会“自然”映射到从SPs返回的数据。

示例:存储过程返回来自“员工”表和“经理”表的列:
-员工ID
-FirstName
-LastName
-经理员工ID
-ManagerFirstName
-ManagerLastName

我是否应该创建一个包含与上述列完全匹配的属性的域对象“雇员与管理器”?

我是否应该创建某种“数据访问对象”,其中包含Employee对象和Manager对象?

不幸的是,使用ORM、参数化查询或更改存储过程不是一个选项。

共有1个答案

呼延化
2023-03-14

懂这就是我要做的,仍然要创建与您的域匹配的域对象。

原因在于

  1. 更容易理解
  2. 假设您使用一个SP创建EmployeeWithManager,如果您有另一个SP(例如带有Car的员工),您将需要创建EmployeeWithCar对象,列表继续显示,这是不可管理的,您将需要大量工作来尝试在它们之间进行转换

我的做法,

  • 创建两个域对象,Employee和Manager(您的经理甚至可以继承Employee)
  • 在Employee中,创建对经理的引用/关系,例如:
Class Employee{

    String Id;
    String FirstName;
    ...

    Manager EmployeeManager;

}
  • 创建数据访问层以使用SP,例如
 Class EmployeeDAL{

        Employee GetEmployeeWithManager(string EmployeeId){
            //user data reader to populate your Employee object and fill it with Manager
            Manager m = New Manager(); //fill Manager from SP
            Employee e = New Employee(); //fill Employee from SP

            e.EmployeeManager = m;
            return e;
        }
    }
  • 在您的业务逻辑/UI中
Class EmployeeController{
     PopulateEmployee(string EmployeeId){
          Employee e = EmployeeDAL.GetEmployeeWithManager(EmployeeId);
          Databind(e);
          'you can also access your manager from e.EmployeeManager
     } 

}

 类似资料:
  • 我有一个用户类,有16个属性,比如名字,姓氏,出生日期,用户名,密码等...这些都存储在MySQL数据库中,当我想要检索用户时,我使用ResultSet。我想将每一列映射回用户属性,但我这样做的效率似乎非常低。例如,我正在做: 也就是说,我检索所有的列,然后通过将所有的列值插入用户构造函数来创建用户对象。 有人知道更快、更整洁的方法吗?

  • null 没有将查询结果映射到域对象的基础结构。QueryDSL的QBean和MappingProject、Spring的BeanPropertyRowMapper和Spring-Data的OneToManyResultSetExtractor似乎级别太低,请参见下文。 没有在MyBatis中免费提供的现成会话/事务级缓存 Mybatis中没有免费提供的现成SQL语句和结果日志 因为我只问一个问题

  • 我是Mapstruct的新手。我有一个Word对象,它包含一个字符串值和一组它自己,我想把它映射到WordDTO,它包含一个值和一组字符串值。我不知道怎么做。正如我在注释中所说,mapstruct不能映射两个对象是有道理的,但如果它有帮助,我将错误放在下面: 我为映射实现了这个接口: 谢谢你的帮助。

  • 在对这个话题进行了大量的测试和研究之后,我无法完全解决我的问题。我正在springboot应用程序中使用modelmapper进行实体/DTO映射。我正在尝试配置modelmapper,将一个集合映射到一个简单的DTO对象。我已经创建了一个自定义转换器,它正在按预期工作: 我现在的问题是将此转换器应用于所有“集合”= 如果我直接在模型映射器中添加转换器,它就是不工作。 你对此有什么提示或解决办法吗

  • 问题内容: 我有一个对象: 我正在寻找一种本机方法,该方法类似于以下方法: JavaScript是否对对象具有这样的功能?(我想为Node.JS使用它,所以我不在乎跨浏览器的问题。) 问题答案: 该对象没有本地对象,但是如何处理: 但是您可以使用以下命令轻松地遍历对象: 更新资料 很多人提到,以前的方法不会返回新对象,而是对对象本身进行操作。为此,我想添加另一个解决方案,该解决方案返回一个新对象并

  • 我开始使用JOOQ和dvd租赁商店数据库aka sakila。基本上,我想找一个演员和他的角色(我创建的表)。到目前为止,我想到了这个: 我希望能够将演员及其角色提取到一个对象中:DTO。我找到了这篇文章https://arnaudroger.github.io/blog/2017/03/02/jooq-one-to-many-without-dto.html但我发现使用sfm的解决方案过于冗长,