Java 内有实体的弹簧投影

Java 内有实体的弹簧投影,java,hibernate,jpa,spring-data,projection,Java,Hibernate,Jpa,Spring Data,Projection,我需要递归sql查询中实体层次结构级别的metainfo,所以我创建了下一个投影 @Value public class ProjectionObject{ MyEntity entity; int metainfo; } @Query(value = "select my_entity.*, 1 as metainfo from my_entities", nativeQuery = true) List<ProjectionObject> f

我需要递归sql查询中实体层次结构级别的metainfo,所以我创建了下一个投影

@Value
public class ProjectionObject{
    MyEntity entity;
    int metainfo;
}

@Query(value = "select my_entity.*, 1 as metainfo from my_entities", nativeQuery = true)
List<ProjectionObject> findSome();
但它返回列表,但我期望列表


因此,我想用ProjectOnObjectEntity处理什么,就像用实体管理器managed by Entity ProjectOnObjectEntity一样,换句话说,我想用metainfo获取一次托管实体,而不获取f.e.层次结构ID,在获取实体之后,我不确定Spring Data Projections是否支持这一点

然而,这是一个完美的用例

Blaze Persistence是JPA之上的查询生成器,它支持JPA模型之上的许多高级DBMS功能。我在它上面创建了实体视图,以便在JPA模型和自定义接口定义的模型之间轻松映射,类似于类固醇上的Spring数据投影。其思想是以您喜欢的方式定义目标结构,并通过JPQL表达式将AttributesGetter映射到实体模型。由于属性名被用作默认映射,您基本上不需要显式映射,因为80%的用例都需要DTO作为实体模型的子集

带有实体视图的投影可以像下面这样简单

@EntityView(MyEntity.class)
interface ProjectionObject {
    @Mapping("this")
    MyEntity getEntity();
    @Mapping("1")
    int getMetaInfo();
}
查询是将实体视图应用于查询的问题,最简单的就是按id进行查询

ProjectionObject dto=entityViewManager.FindentialManager,ProjectionObject.class,id

但是Spring数据集成允许您像使用Spring数据投影一样使用它:

现在,您可以获取该对象,然后在更改状态后将其刷新回数据库:

ProjectionObject o = repository.findOne(123);
o.setName(o.getName().toUpperCase());
repository.save(o);
它将只刷新名称,正如您将在SQL中看到的那样

@UpdatableEntityView
@EntityView(MyEntity.class)
interface ProjectionObject {
    @IdMapping
    Integer getId();
    String getName();
    void setName(String name);
    @Mapping("1")
    int getMetaInfo();
}
ProjectionObject o = repository.findOne(123);
o.setName(o.getName().toUpperCase());
repository.save(o);