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

时间:2017-04-11 17:50:05

标签: java spring jpa

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

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

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

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

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

  

自动生成查询

public interface UserRepository extends CrudRepository<UserAccount, Long> {

    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();
}

2 个答案:

答案 0 :(得分:5)

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

<T> T getByUsername(String username, Class<T> projection)

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

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

public interface JPAProjection {
}

public interface UserRepository extends CrudRepository<UserAccount, Long> {
    <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection);
}
  

投影界面

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

    @Value("#{target.firstname}")
    String getFirstname();

    @Value("#{target.lastname}")
    String getLastname();
}

然后我可以通过

调用查询方法
getByUsername("...", UserDetailsProjection.class)

答案 1 :(得分:0)

只需在get(例如find)和By之间添加一个大写字符即可。在查询生成中将忽略它。

public interface UserRepository extends CrudRepository<UserAccount, Long> {

   AuthenticateProjection getByUsername(String username);

   UserDetailsProjection getAnotherByUsername(String username);

}