我的 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/