hibernate纯sql查询结果集映射为DTO(VO,DO)

感谢glamey兄弟的文章,正好解决了当前遇到的问题。原文链接如下:http://glamey.iteye.com/blog/721019

    假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下: 
String sql = "select u.userName as userName ,p.title as title ,p.addTime as addTime from user as u,post as p where u.id=p.userId"    
Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));  
    上面select中as后面的内容必须和PostVO中属性名一致,这样就可以返回一个针对PostVO的一个集合。 
    其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。 
    如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成: 
setResultTransformer(new VOResultTransformer(PostVO.class));  
    另外,除了以上glamey的方法外,还有一种方法: 
Query q = session.createQuery("select new com.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");  
List<MsgInfo> list=q.list();  
    其中,MsgInfo是DTO。值得注意的是,第二种方法中DTO必须提供带参数的构造方法,并且HQL语句中属性的位置要与构造方法中的位置一一对应。
JPA(Java Persistence API)是Java平台中用于持久化数据的规范,它允许开发者通过Java来管理关系型数据。在使用JPA时,通常会通过Repository接口来操作数据库,而Spring Data JPA为这个过程提供了便利,允许我们通过定义接口来实现数据访问层(DAO)的编写。 在Spring Data JPA的Repository中,你可以使用Spring提供的查询方法命名规则来声明查询,也可以使用`@Query`注解直接编写原生的SQL语句或JPQL语句。如果你需要将查询结果直接映射到一个数据传输对象(DTO),而不是JPA实体类,你可以使用构造函数绑定的方式。 构造函数映射DTO通常涉及以下几个步骤: 1. 定义一个DTO类,这个类通常不包含任何JPA注解。 2. 在Repository接口中,使用`@Query`注解编写SQL查询语句,并指定返回值类型为DTO类的实例。 3. 使用`@Query`注解的`nativeQuery`属性来指定是否为原生SQL查询。 4. 使用`ConstructorResult`和`ConstructorExpression`来指定构造函数参数,这些参数将与查询结果的列名相对应。 以下是一个简单的例子: ```java // DTO类 public class MyDto { private final String columnOne; private final Integer columnTwo; public MyDto(String columnOne, Integer columnTwo) { this.columnOne = columnOne; this.columnTwo = columnTwo; } // getters and setters } // Repository接口 public interface MyEntityRepository extends JpaRepository<MyEntity, Long> { @Query(value = "SELECT new MyDto(e.columnOne, e.columnTwo) FROM MyEntity e") List<MyDto> findCustomDto(); } ``` 在这个例子中,`findCustomDto`方法使用`@Query`注解定义了一个查询,返回值是一个DTO对象列表。查询结果将通过`MyDto`的构造函数映射DTO对象中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值