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 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)