我的春季项目中有资源库:
@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
?如果可能,请提供示例或核心理念。
答案 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,你必须使用第二种方式。