Java SpringJPA:在同一查询接口上使用多个投影

Java SpringJPA:在同一查询接口上使用多个投影,java,spring,jpa,Java,Spring,Jpa,我试图使用SpringJPA的投影从查询结果中过滤掉不必要的数据。但是,我有多个投影,需要在同一接口方法上使用 问题是,我试图用不同的返回对象从同一方法查询数据,但java不允许这样做 查询是由JPA根据方法名自动生成的,因此我无法更改方法名 除了创建一个新的界面,还有其他选择吗?因为我认为这是一个麻烦和不必要的过程 下面是一个示例代码,说明了我正在尝试做的事情 自动生成查询 因此,我设法找出了如何在一个查询中使用多个投影 <T> T getByUsername(String use

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

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

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

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

下面是一个示例代码,说明了我正在尝试做的事情

自动生成查询


因此,我设法找出了如何在一个查询中使用多个投影

<T> T getByUsername(String username, Class<T> projection)
然后我可以通过

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

只需在
get
(或例如
find
)和
By
之间添加一些内容,以大写字符开头。它在查询生成中被忽略

public interface UserRepository extends CrudRepository<UserAccount, Long> {

   AuthenticateProjection getByUsername(String username);

   UserDetailsProjection getAnotherByUsername(String username);

}
public interface UserRepository扩展了crudepository{
AuthenticateProjectionGetByUserName(字符串用户名);
UserDetailsProject getAnotherByUsername(字符串用户名);
}

您为什么要“过滤”信息?这是从控制器返回的信息,还是供内部使用?@chrylis它将返回控制器i尝试使用相同的解决方案,但对我无效。在Eclipse控制台中,我看到一个错误:
由以下原因引起:org.hibernate.hql.internal.ast.QuerySyntaxException:意外标记:从第1行第9列附近[从com.app.company.domain.organization.organization中选择generatedAlias0,其中generatedAlias0.deletedAt为null]
。请看“select”语句:没有任何列。也许你也有同样的问题?存储库似乎没有收到正确的投影类型……有什么想法吗?谢谢!嗯,这很奇怪。我没有任何问题。你介意附上你的申请表吗?也许是巴斯德宾@安德烈亚贝维拉卡
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)
public interface UserRepository extends CrudRepository<UserAccount, Long> {

   AuthenticateProjection getByUsername(String username);

   UserDetailsProjection getAnotherByUsername(String username);

}