Spring 我可以使用EntityGraph从实体中选择特定字段吗?

Spring 我可以使用EntityGraph从实体中选择特定字段吗?,spring,spring-boot,hibernate,spring-data-jpa,Spring,Spring Boot,Hibernate,Spring Data Jpa,我有一个实体,其中有多个(比如说超过5个)字段。我只想列出实体中的两个字段。我用实体管理器和JPA查询成功地实现了这一点。在下面的代码中,我添加了如何使用EntityManager,但这可能不是最佳解决方案。我想问的是,我能用EntityGraph实现吗 List<Object[]> test = entityManager.createQuery("SELECT c.a, c.b FROM TestClass c WHERE c.id = :id"

我有一个实体,其中有多个(比如说超过5个)字段。我只想列出实体中的两个字段。我用实体管理器和JPA查询成功地实现了这一点。在下面的代码中,我添加了如何使用EntityManager,但这可能不是最佳解决方案。我想问的是,我能用EntityGraph实现吗

        List<Object[]> test = entityManager.createQuery("SELECT c.a, c.b FROM TestClass c WHERE c.id = :id", Object[].class)
                .setParameter("id", id)
                .getResultList();
        TestClassResult testClassResult = new TestClassResult();
        for (Object[] row : test) {
            testClassResult.setA((BigDecimal) row[0]);
            testClassResult.setB((BigDecimal) row[1]);
        }
List test=entityManager.createQuery(“从TestClass c中选择c.a、c.b,其中c.id=:id”,Object[].class)
.setParameter(“id”,id)
.getResultList();
TestClassResult TestClassResult=新的TestClassResult();
对于(对象[]行:测试){
testClassResult.setA((BigDecimal)行[0]);
testClassResult.setB((BigDecimal)行[1]);
}

据我所知,实体图定义了要从数据库中获取的属性,因此您可以急切地获取2个属性,而懒散地获取另外3个属性,“Thorben Janssen”在其网站上有一篇关于图形的好文章,专门获取选定属性的另一种方法是使用DTO投影,他也有一篇关于这个主题的好文章。

据我所知,在将实体图注册为fetch graph(不同于加载图)时,只允许实现获取您指定的内容,但至少Hibernate不支持这一点

无论如何,在这种情况下,DTO投影通常是解决问题的方法,我认为这是一个完美的应用案例

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,类似于类固醇上的Spring数据投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型

在Blaze持久性实体视图中,您的用例的DTO模型可能如下所示:

@EntityView(TestClass.class)
public interface TestClassResult {
    @IdMapping
    Integer getId();
    BigDecimal getA();
    BigDecimal getB();
}
查询是将实体视图应用于查询的问题,最简单的就是按id进行查询

TestClassResult a=entityViewManager.find(entityManager,TestClassResult.class,id)

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

Page findAll(可分页);
最好的是,它只会获取实际需要的状态

Page<TestClassResult> findAll(Pageable pageable);