我正在尝试使用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();
}
答案 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);
}