Spring JPA:在同一查询界面上使用多个投影

我试图使用Spring JPA的投影从查询结果中过滤掉不必要的数据。 但是,我有多个投影需要在同一个接口方法上使用。

问题是,我试图用不同的返回对象查询来自同一方法的数据,但java不允许这样做。

该查询由JPA根据方法名称自动生成,因此我无法更改方法名称。

除了创建一个新界面之外,还有其他选择,因为我认为这是一个麻烦和不必要的

这是一个示例代码,我正在尝试做什么。

自动生成的查询

public interface UserRepository extends CrudRepository { AuthenticateProjection getByUsername(String username); UserDetailsProjection getByUsername(String username); } 

预测

 public interface AuthenticateProjection { @Value("#{target.username}") String getUsername(); @Value("#{target.credentail.token}") String getHashPassword(); } public interface UserDetailsProjection { @Value("#{target.username}") String getUsername(); @Value("#{target.firstname}") String getFirstName(); @Value("#{target.lastname}") String getLastName(); } 

所以我设法弄清楚如何使用单个查询使用多个投影。

  T getByUsername(String username, Class projection) 

这允许方法调用者指定要应用于查询的投影类型。

为了进一步改进这一点,它不容易出错,我做了一个空白的界面,投影必须扩展,以便能够将类插入参数。

 public interface JPAProjection { } public interface UserRepository extends CrudRepository {  T getByUsername(String username, Class projection); } 

投影界面

 public interface UserDetailsProjection extends JPAProjection{ @Value("#{target.username}") String getUsername(); @Value("#{target.firstname}") String getFirstname(); @Value("#{target.lastname}") String getLastname(); } 

然后我可以调用查询方法

 getByUsername("...", UserDetailsProjection.class)