java - 单个 Spring 存储库可生成不同的对象或实体

标签 java spring spring-data spring-data-jpa

我的 spring 项目中有存储库:

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

    boolean existsById(long id);

    List<User> findAllByEmail(String email);

}

它工作正常,但似乎有必要使用LightUser

public class LightUser implements Identifiable<Long>, Auditable {

    @Id
    @Column
    private Long id;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false, updatable = false)
    private UserType userType;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false)
    private String domain;

    // get/set methods/ equals/hashcode
}

LightUser 实体包含我通常需要的一些字段(User 实体中存在的所有字段),并且我想使用存储库将结果映射到 来向数据库发出请求>LightUser(映射到 dto 会非常好)。

是否可以在UserRepository中添加特殊方法来满足我的需求,或者我应该为同一张表但为LightUser创建类似的方法?如果可能,请提供示例或核心思想。

最佳答案

首先,您必须从界面中删除 @Repository 注释,因为它是多余的。

是的,您可以使用两种方式选择 LightUser:

1)投影

您必须创建具有所需属性的投影:

interface LightUser {
    Long getId();
    String getEmail();
}

并添加适当的选择方法:

@Query("SELECT u.id AS id, u.email AS email FROM User u WHERE u.id = :id")
LightUser findLightUser(@Param("id") String id)

这种方式的缺点是你的投影应该是一个接口(interface)(但如果你将它用于REST,那就可以了)

2)DTO

您的 DTO 应该有一个包含所需字段的构造函数,例如 id 和 email:

class LightUser {
    private Long id;
    private String email;

    public LightUser(Long id, String email) {
        this.id = id;
        this.email = email;
    }

    // getters and setters
}

然后您可以为此 DTO 编写一个选择:

@Query("SELECT new com.test.LightUser(u.id, u.email) FROM User u WHERE u.id = :id")
LightUser findLightUser(@Param("id") String id)

由于您的 LightUser 就像 DTO,因此您必须使用第二种方式。

关于java - 单个 Spring 存储库可生成不同的对象或实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47282626/

相关文章:

java - 如何查询 CursorLoader?

java - XML 解析到 MySQL 数据库

Spring - 在浏览器中显示 PDF 文件而不是下载

java - XML 架构引用

redis - 如何将 redis CrudRepository 关联到数据库

java - 在 servlet 中处理图像

java - spring boot 2 与 elasticsearch 2.4 通过 spring data

java - List<Long> 如何引用具有 BigInteger 值的 ArrayList

java - Spring数据和PostgreSQL : ERROR: operator does not exist: uuid = record (when UUID list size > 1)

java - 将 ResultSet 获取到私有(private)字符串的最快方法?