当前位置:首页 > 开发 > 编程语言 > Hibernate > 正文

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

发表于: 2012-09-23   作者:frankco   来源:转载   浏览:
摘要:       DTO-数据传输对象;pojo-最纯粹的java对象与数据库中的表一一对应。       简单讲:DTO起到业务数据的传递作用,pojo则与持久层数据库打交道。         有时候我们需要查询返回DTO对象,因为DTO

      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中属性使用了驼峰命名,但结果出错。网上有文章说:只需别名和属性名称一致即可;但我测试未成功。有经验的朋友请指教!)

 

搞完!

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的
在这里以DTO来描述,稍有欠缺,DTO的引用来源于DELPHI的remberobject (RO)三层。 是通
在一次开发中我需要从Hibernate查询返回List对象中(注:这个list对象并非一个完整的model类,而是
J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的
DAO: data access object数据访问对象 这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的
PO persitant object 持久对象 PO persitant object 持久对象 BO business object 业务对象 VO valu
POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对P
POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对P
PO(bean,entity等命名) : persistant object持久对象,数据库表中的记录在java对象中的显示状态
J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号