`

hibernate查询返回DTO对象,DTO封装了多个pojo对象的属性

阅读更多

      DTO-数据传输对象;pojo-最纯粹的java对象与数据库中的表一一对应。

      简单讲:DTO起到业务数据的传递作用,pojo则与持久层数据库打交道。

 

      有时候我们需要查询返回DTO对象,因为DTO封装我们操作此对象的业务方法;而这些业务方法从分层的思想上看不能封装到pojo中,因为这违背了hibernate编程规范,pojo(Plain Ordinary Java Object是一个简单的普通Java对象,它不包含业务逻辑或持久逻辑。

       hibernate查询返回DTO对象,DTO可能封装了多个pojo对象的属性和自己的业务方法;比如一个购物车的DTO可能封装了与购物车添加商品、移除商品等的方法。

 

       上代码:

public AccountDTO getAccountByUsernameAndPassword(AccountDTO accountDTO) {
		String sql = "SELECT"
		      + " SIGNON.USERNAME,"
		      + " ACCOUNT.EMAIL,"
		      + " ACCOUNT.FIRSTNAME,"
		      + " ACCOUNT.LASTNAME,"
		      + " ACCOUNT.STATUS,"
		      + " ACCOUNT.ADDR1,"
		      + " ACCOUNT.ADDR2,"
		      + " ACCOUNT.CITY,"
		      + " ACCOUNT.STATE,"
		      + " ACCOUNT.ZIP,"
		      + " ACCOUNT.COUNTRY,"
		      + " ACCOUNT.PHONE,"
		      + " PROFILE.LANGPREF,"
		      + " PROFILE.FAVCATEGORY,"
		      + " PROFILE.MYLISTOPT,"
		      + " PROFILE.BANNEROPT,"
		      + " BANNERDATA.BANNERNAME"
		      + " FROM ACCOUNT, PROFILE, SIGNON, BANNERDATA"
		      + " WHERE ACCOUNT.USERID = ?"
		      + " AND SIGNON.PASSWORD = ?"
		      + " AND SIGNON.USERNAME = ACCOUNT.USERID"
		      + " AND PROFILE.USERID = ACCOUNT.USERID"
		      + " AND PROFILE.FAVCATEGORY = BANNERDATA.FAVCATEGORY";
//		Query query = this.getSession().createQuery(hql);
		//此方法有transaction的异常,因为我这里不是手动管理hibernate的事物,hibernate事物交给spring管理,此问题没能解决
//		Query query = this.getSessionFactory().getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(aDTO.class));
		Query query = this.getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(AccountDTO.class));
		query.setString(0, accountDTO.getUsername());
		query.setString(1, accountDTO.getPassword());
		return (AccountDTO) query.uniqueResult();
	}

 这里的重点方法:

Query query = this.getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(AccountDTO.class));

 原生sql的查询,返回结果设置到DTO,hibernate给我们做了处理,类似与jdbc的查询这里可能用到了反射,所以要求DTO中的属性要与表字段名称相同,并且为全都小写。(我试图在sql中使用别名,而且DTO中属性使用了驼峰命名,但结果出错。网上有文章说:只需别名和属性名称一致即可;但我测试未成功。有经验的朋友请指教!)

 

搞完!

分享到:
评论

相关推荐

    eclipse插件,根据数据库表自动生成DTO(pojo)插件

    在生成的DTO和POJO类中,注解可以用来标记字段,以便于框架如Hibernate或MyBatis进行ORM(对象关系映射)操作。 `JavaBeanTool_2.0`可能是插件的一个版本号,暗示这个工具已经经过了多次迭代和优化。JavaBean是一种...

    java术语(PO/POJO/VO/BO/DAO/DTO)

    DTO可能会包含多个VO对象的组合,以适应更复杂的传输需求。 这六种对象在实际项目开发中起到不同的作用,理解并正确使用它们可以帮助我们构建更加清晰、模块化的软件架构。例如,PO和DAO一起用于数据持久化,BO处理...

    JAVA中的POJO、VO、PO、DO、DTO都是什么?有什么区别?

    1. POJO(Plain Old Java Object):POJO是一个通用术语,指没有特定框架限制的简单Java对象。它通常包含了业务逻辑和数据属性,不包含任何特定框架的注解或接口。POJOs被广泛用于表示业务实体,可以作为ORM(对象...

    Java的几种对象(PO-VO-DAO-BO-POJO)解释

    一个简单的PO对象可以代表数据库表中的一条记录,而多个记录则可以通过PO的集合来表示。需要注意的是,PO对象本身不应该包含任何数据库操作的行为或逻辑,它仅仅是用来存储数据的一种方式。例如: - **用途**:当...

    Javabean与DTO的区别.docx

    JavaBean和DTO(Data Transfer Object)都是Java编程中常见的对象模型,它们各自在不同的场景下发挥着重要作用。 JavaBean是Java语言中的一种设计模式,主要用于封装数据和业务逻辑。它遵循一定的规范,包括: 1. ...

    Struts、Spring、Hibernate&Ajax;学习笔记总结

    - **BO**:包含了具体的业务逻辑,通常包含多个 PO 或 POJO,用于复杂的业务处理。 #### Spring 框架 **Spring** 是一个轻量级的 Java 应用程序框架,主要目的是简化企业级应用的开发。Spring 通过依赖注入...

    POJO IN ACTION

    - 通过将业务逻辑封装在POJO中,可以更好地遵循DDD的原则,创建具有明确职责的对象。 - 使用POJO作为领域模型的基础,有助于实现业务逻辑与技术实现的解耦。 ##### 测试驱动开发(TDD) 测试驱动开发是一种软件...

    pojo-bean-editor

    "pojo-bean-editor"是一个专门针对Java编程语言中的POJO(Plain Old Java Object)对象进行编辑的工具。POJO是Java开发中一个常见的概念,它代表了一个简单的、无特定框架约束的Java类,通常用于封装数据。这个编辑...

    充血模型设想实现(2010/07/30更新)

    这个模型与贫血模型相对,后者通常由无行为的POJO(Plain Old Java Object)或DTO(Data Transfer Object)组成,业务逻辑被分离到服务层。 在2010年的更新中,博主可能讨论了如何在实际项目中应用充血模型,可能...

    人力资源JAVA项目描述.doc

    10. DTO和POJO:Data Transfer Object和Plain Old Java Object,用于数据传输和简单数据封装。 11. AJAX:Asynchronous JavaScript and XML,实现页面无刷新更新。 12. Windows, XP, professional、JDK1.5、...

    Java Web开发学习路线图(JBoss Seam方向)

    1. **OO概念与实践**:深入学习面向对象编程的理论与实践,包括封装、继承、多态等核心概念。 2. **设计模式**:掌握常见的设计模式,如Factory、Adapter、Singleton等,理解它们在解决特定问题时的作用。 #### 六...

Global site tag (gtag.js) - Google Analytics