Spring Data JPA 中 DTO DAO的映射

本文介绍了Spring Data JPA如何简化数据访问,通过示例展示了如何使用JpaRepository接口方法和@Query注解进行查询。此外,还讨论了如何直接将查询结果映射到DTO对象,避免额外的映射层转换,如将User实体转换为UserNameDTO。
摘要由CSDN通过智能技术生成

Spring Data JPA的一个隐藏优点是可以将查询结果直接放到DTO中,而不是由映射器在更高的级别转换它。当然,这取决于您是否同意这种处理数据的方式。

Spring数据本身是介于查询数据的方式和底层不同数据源类型之间的抽象层。使用Spring数据编写查询的方式不会改变。它将把查询转换为JPA、MongoDB、Couchbase、Neo4j a.s.o的相应底层查询语言。

Spring数据的特殊之处在于,只创建接口方法就足够了。不需要实现任何存储库或data access object。

 

Spring Data JPA中的基本接口方法示例

这只是一个展示Spring数据工作原理的JpaRepository示例:

package de.smarterco.example.repositories;

import de.smarterco.example.entities.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findAll();
}

关键字:
@Repository—将该类标记为依赖框架获取的存储库。
JpaRepository—通过使用JPA数据源的基本功能扩展我们的接口用户存储库。
<User, Long> - User是我们的实体,此存储库将在其上执行查询。Long是用户实体中的id类型。
List<User> findAll()—方法的示例,该方法将从存储库检索所有用户并将其存储到列表中。Spring数据中的查询方法以关键字find开始,然后是限制和参数。

 

使用@Query注解

还有另一种方法可以使用Spring Data JPA实现相同的结果。Spring Data JPA为您提供关键字查询,它允许您使用JPQL - Java持久性查询语言编写自己的查询。

package de.smarterco.example.repositories;

import de.smarterco.example.entities.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User AS u")
    List<User> findAll();
}

查询结果直接指向DTO

本段描述如何将查询结果直接放到DTO中,而不是将数据映射到存储库外的第二层。
您首先需要的是DTO,就像我们的UserNameDTO一样。

请注意,您将需要一个接受所有private变量作为参数的构造函数。

package de.smarterco.example.dto;

public class UserNameDTO {

    private Long id;
    private String name;

    public UserNameDTO(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

直接将数据存储到DTO(解释如下)是通过在JpaRepository中编写JPQL查询来完成的:

List<UserNameDTO> retrieveUsernameAsDTO(…)——  这是一个新方法,它将以UserNameDTO列表而不是User的形式检索结果。
@Param(“name”)字符串名—    @Param帮助系统识别传递的参数并将其插入查询。:name。
new de.smarterco.example.dto.UserNameDTO (u.id, u.name) -  这就是神奇的地方。JPQL查询使用之前创建的完整包名和参数化构造函数创建一个新的UserNameDTO。剩下的惟一事情是映射必要的User变量(u.id, u.name)到DTO上。

 

package de.smarterco.example.repositories;

import de.smarterco.example.dto.UserNameDTO;
import de.smarterco.example.entities.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User AS u")
    List<User> findAll();

    @Query("SELECT new de.smarterco.example.dto.UserNameDTO(u.id, u.name) FROM User u WHERE u.name = :name")
    List<UserNameDTO> retrieveUsernameAsDTO(@Param("name") String name);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值