gpt4 book ai didi

java - Spring JPA : Using multiple projection on same query interface

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:04:03 24 4
gpt4 key购买 nike

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

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

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

除了创建一个新界面之外,还有其他选择吗,因为我认为这既麻烦又没必要

这是我正在尝试做的示例代码。

Auto-Generated Query

public interface UserRepository extends CrudRepository<UserAccount, Long> {

AuthenticateProjection getByUsername(String username);

UserDetailsProjection getByUsername(String username);

}

Projections

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

Projection Interface

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

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

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

然后我可以调用查询方法

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

关于java - Spring JPA : Using multiple projection on same query interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43352967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com