手动将 @Entity 转换为投影接口

Ser*_*sky 5 java spring hibernate spring-data spring-data-jpa

所以我大部分时间都在使用 Spring Data Repositories。但我遇到了一个用例,我无法使用 Spring 存储库来检索我需要返回给客户端的实体。所以我的类ResourceEntity是一个 Spring 数据实体。我想将这个实体作为ResourceProjection接口返回。

@Getter
@Setter
@NoArgsConstructor
@Entity
public class ResourceEntity{
    private Long id;
    private String name;
    private String anotherFieldThatIsNotInTheProjection;
}

public interface ResourceProjection {
    Long getId();
    String getName();
}
Run Code Online (Sandbox Code Playgroud)

通常对于 Spring 存储库,我会定义类似的内容:

public interface ResourceRepository extends PagingAndSortingRepository<ResourceEntity, Long> {
    Optional<ResourceProjection> getById(Long id);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我无法使用 Spring Data 生成的“自动代理”来自动实现实体数据的投影。

所以我的问题是:有没有办法“手动”将实体转换为投影?

我想到的另一个解决方案是返回实体并使用 @JsonIgnore 之类的 Jackson 注释来防止返回一些数据,但这对于我的代码编写方式来说并不是最佳的。

否则,我始终可以创建一个 DTO 类来填充来自实体的数据。但由于我已经为其他目的创建了投影,所以我想避免创建第二个“DTO”。

小智 9

您可以通过以下方式以编程方式进行投影:

import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;

 //... 
  resourceEntity = //find resource
  ProjectionFactory pf = new SpelAwareProxyProjectionFactory();
  ResourceProjection rp = pf.createProjection(ResourceProjection.class, resourceEntity)
Run Code Online (Sandbox Code Playgroud)