繁体   English   中英

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

[英]Spring JPA: Using multiple projection on same query interface

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

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

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

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

public interface UserRepository extends CrudRepository<UserAccount, Long> {

   AuthenticateProjection getByUsername(String username);

   UserDetailsProjection getAnotherByUsername(String username);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM