JPA通过SqlResultSetMapping和NamedNativeQuery实现DTO

栏目: Java · 发布时间: 6年前

内容简介:获取超出你实际需要的数据容易导致性能损失。使用DTO可以让我们只提取所需的数据。在这里我们展示依赖SqlResultSetMapping,NamedNativeQuery和EntityManager实现DTO。假设需要从实体Car中获取name和color两项数据的CarDto,Car代码如下,在其中使用了注释@SqlResultSetMapping,@NamedNativeQuery:CarDto代码:

获取超出你实际需要的数据容易导致性能损失。使用DTO可以让我们只提取所需的数据。在这里我们展示依赖SqlResultSetMapping,NamedNativeQuery和EntityManager实现DTO。

假设需要从实体Car中获取name和color两项数据的CarDto,Car代码如下,在其中使用了注释@SqlResultSetMapping,@NamedNativeQuery:

@NamedNativeQuery(
        name=<font>"CarDto"</font><font>,
        query=</font><font>"select name, color from car"</font><font>,
        resultSetMapping=</font><font>"CarDto"</font><font>
)
@SqlResultSetMapping(
        name=</font><font>"CarDto"</font><font>,
        classes=@ConstructorResult(
                targetClass=CarDto.<b>class</b>,
                columns={
                    @ColumnResult(name=</font><font>"name"</font><font>),
                    @ColumnResult(name=</font><font>"color"</font><font>)
                }                
        )
)
@Entity
@Table(name = </font><font>"car"</font><font>)
<b>public</b> <b>class</b> Car implements Serializable {

    <b>private</b> <b>static</b> <b>final</b> <b>long</b> serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    <b>private</b> Long id;

    <b>private</b> String name;
    <b>private</b> String engine;
    <b>private</b> String color;
</font>

CarDto代码:

<b>public</b> <b>class</b> CarDto implements Serializable {

    <b>private</b> <b>static</b> <b>final</b> <b>long</b> serialVersionUID = 1L;

    <b>private</b> <b>final</b> String name;
    <b>private</b> <b>final</b> String color;

    <b>public</b> CarDto(String name, String color) {
        <b>this</b>.name = name;
        <b>this</b>.color = color;
    }

    <b>public</b> String getName() {
        <b>return</b> name;
    }

    <b>public</b> String getColor() {
        <b>return</b> color;
    }    

    @Override
    <b>public</b> String toString() {
        <b>return</b> <font>"CarDto{"</font><font> + </font><font>"name="</font><font> + name + </font><font>", color="</font><font> + color + '}';
    }        
}
</font>

第二步,编制DTO调用EntityManager的createNameQuery返回CarDto的List:

@Repository
@Transactional
<b>public</b> <b>class</b> Dao<T, ID <b>extends</b> Serializable> implements GenericDao<T, ID> {

    @PersistenceContext
    <b>private</b> EntityManager entityManager;

    @Override
    <b>public</b> <S <b>extends</b> T> S persist(S entity) {
        
        Objects.requireNonNull(entity, <font>"Cannot persist a null entity"</font><font>);
        
        entityManager.persist(entity);

        <b>return</b> entity;
    }

    @Transactional(readOnly=<b>true</b>)
    <b>public</b> List<CarDto> fetchCars() {
        Query query = entityManager.createNamedQuery(</font><font>"CarDto"</font><font>);                
        List<CarDto> result = query.getResultList();

        <b>return</b> result;
    }

    <b>protected</b> EntityManager getEntityManager() {
        <b>return</b> entityManager;
    }
}

Service调用:
</font>
@Service
<b>public</b> <b>class</b> CarService {

    <b>private</b> <b>final</b> Dao dao;

    <b>public</b> CarService(Dao dao) {
        <b>this</b>.dao = dao;
    }

   
    <b>public</b> List<CarDto> fetchCars() {
        <b>return</b> dao.fetchCars();
    }
}

也可以使用Spring data project投影实现获取DTO,参考 https://www.jdon.com/51628


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

爆发

爆发

[美] 艾伯特-拉斯洛·巴拉巴西 / 马慧 / 中国人民大学出版社 / 2012-6 / 59.90元

1. 本书是一本超越《黑天鹅》的惊世之作。如果说塔勒布认为人类行为是随机的,都是小概率事件,是不可以预测的;那么全球复杂网络权威Barabasi则认为,人类行为93%是可以预测的。 2. Barabasi的研究是在人类生活数字化的大数据时代基础上进行的,移动电话、网络以及电子邮件使人类 行为变得更加容易量化,将我们的社会变成了一个巨大的数据库。他认为,人类正处在一个聚合点上,在这里数据、科学......一起来看看 《爆发》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具