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 {
List findAll();
}
关键字:
@Repository—将该类标记为依赖框架获取的存储库。
JpaRepository—通过使用JPA数据源的基本功能扩展我们的接口用户存储库。
List
使用@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 {
@Query("SELECT u FROM User AS u")
List 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
@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 {
@Query("SELECT u FROM User AS u")
List findAll();
@Query("SELECT new de.smarterco.example.dto.UserNameDTO(u.id, u.name) FROM User u WHERE u.name = :name")
List retrieveUsernameAsDTO(@Param("name") String name);
}