Java Spring数据JPA映射嵌套实体

Java Spring数据JPA映射嵌套实体,java,spring,spring-data-jpa,spring-data,Java,Spring,Spring Data Jpa,Spring Data,我对在Spring数据JPA中使用投影有点困惑。 我想通过在一个查询中只请求所需的列(最好是)来优化我的查询,我认为使用投影是一个好主意。但是,嵌套投影的投影似乎是开放的,并且请求所有列,进一步嵌套是不可能的 我试图用@Query(找不到如何映射嵌套列表)、@EntityGraph(找不到如何只请求指定的列)和@sqlresultsmapping(找不到如何映射嵌套列表)找到一个解决方案,但它对我不起作用。 除了接收列表和手动映射之外,是否有其他解决方案 我有下一个实体类(问题简化): 结果得到

我对在Spring数据JPA中使用投影有点困惑。 我想通过在一个查询中只请求所需的列(最好是)来优化我的查询,我认为使用投影是一个好主意。但是,嵌套投影的投影似乎是开放的,并且请求所有列,进一步嵌套是不可能的

我试图用
@Query
(找不到如何映射嵌套列表)、
@EntityGraph
(找不到如何只请求指定的列)和
@sqlresultsmapping
(找不到如何映射嵌套列表)找到一个解决方案,但它对我不起作用。 除了接收
列表
和手动映射之外,是否有其他解决方案

我有下一个实体类(问题简化):

结果得到如下结果:

{
    id: 1,
    test: {
        name: test1,
        questions: [{
            name: quest1
        }, {
            name: quest2
        }]
    }
}

我做过这样的事。。。您将拥有存储库接口,该接口将扩展Crudepository等。使用完整对象(TestAttempt等),您可以单独定义投影。投影接口可以包含其他投影接口(TestAttemptSummary可以包含TestSummary),当在给定存储库中使用投影接口时,定义的方法将应用于存储库配置的对象类型。像这样的

public interface TestAttemptSummary {
    Long getId();
    TestSummary getTest();
}

public interface TestSummary {
    String getName();
    List<QuestionSummary> getQuestions();
}

public interface QuestionSummary {
    String getName();
}

public interface TestAttemptRepository extends CrudRepository<TestAttempt, Long> {
    TestAttemptSummary getTestAttemptSummary();
}
公共接口测试摘要{
长getId();
TestSummary getTest();
}
公共接口测试摘要{
字符串getName();
列出问题();
}
公共界面问题摘要{
字符串getName();
}
公共接口TestAttemptRepository扩展了Crudepository{
TestAttemptSummary getTestAttemptSummary();
}

这是否回答了您的问题@AlanHay,我曾尝试手动编写查询,但Spring似乎无法用两个字段映射嵌套的实体,而且当子查询没有引入EXISTS时,我只能在选择列表中指定一个表达式,甚至当我去掉查询中的questions字段时,getTest()方法抛出IllegalAccessException,因为StringI尝试这样做时框架映射测试。但问题不会通过查询获取(生成的查询如下所示:select…from test_TRUMENT ta INTERNAR join test t on ta.test_id=t.id),所以当我尝试从测试获取问题()时,会得到LazyInitializationException。
{
    id: 1,
    test: {
        name: test1,
        questions: [{
            name: quest1
        }, {
            name: quest2
        }]
    }
}
public interface TestAttemptSummary {
    Long getId();
    TestSummary getTest();
}

public interface TestSummary {
    String getName();
    List<QuestionSummary> getQuestions();
}

public interface QuestionSummary {
    String getName();
}

public interface TestAttemptRepository extends CrudRepository<TestAttempt, Long> {
    TestAttemptSummary getTestAttemptSummary();
}