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

时间:2017-11-14 09:56:29

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

我的春季项目中有资源库:

@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实体中),我希望使用存储库映射结果向DB请求LightUser(它会非常适合映射到dto)。

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

2 个答案:

答案 0 :(得分:2)

UserRepository是一个JPA存储库,用于管理User实体,如其定义UserRepository extends JpaRepository<User, Long>中所述。

对于新实体LightUser,最好像这样创建一个单独的存储库LightUserRepository

@Repository
public interface LightUserRepository extends JpaRepository<LightUser, Long> {

    ....

}

答案 1 :(得分:2)

首先,您必须从界面中删除@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)

这种方式的缺点是您的投影应该是一个界面(但是如果您将它用于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,你必须使用第二种方式。