gpt4 book ai didi

java - Spring Data JPA 映射嵌套实体

转载 作者:行者123 更新时间:2023-11-30 12:01:56 25 4
gpt4 key购买 nike

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

我试图通过 @Query 找到解决方案(找不到如何映射嵌套列表),@EntityGraph (找不到如何只请求指定的列)和 @SqlResultSetMapping (找不到如何制作映射嵌套列表),但它对我不起作用。除了收到List<Object[]>还有什么解决办法吗?并手动映射?

我有下一个实体类(针对问题进行了简化):

public class TestAttempt{
private Long id;
private User targetUser;
private Test test;
}

public class Test{
private Long id;
private String name;
private Set<Question> questions;
}

public class Question{
private Long id;
private String name;
private Test test;
}

我想写这样的东西(它可以只是 TestAttemptnull 在未使用的字段中):

public interface TestAttemptList {
Long getId();
Test getTest();

interface Test {
String getName();

List<Question> getQuestions();

interface Question {
String getName();
}
}
}

public interface TestAttemptRepository extends JpaRepository<TestAttempt, Long> {
List<TestAttemptList> getAllByTargetUserId(Long targetUserId);
}

结果是这样的:

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

最佳答案

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

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();
}

关于java - Spring Data JPA 映射嵌套实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59143611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com