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