当前位置: 首页 > 面试题库 >

Spring Data JPA-返回对象的最佳方法?

阎鸿煊
2023-03-14
问题内容

我有这样的对象:

@Entity
public class DocumentationRecord {
    @Id
    @GeneratedValue
    private long id;

    private String topic;
    private boolean isParent;
    @OneToMany
    private List<DocumentationRecord> children;
...
}

现在我只想获取主题和ID。有没有办法像这样获得它:

[
{
id: 4234234,
topic: "fsdfsdf"
},...
]

因为即使只使用此查询

public interface DocumentationRecordRepository extends CrudRepository<DocumentationRecord, Long> {

    @Query("SELECT d.topic as topic, d.id as id FROM DocumentationRecord d")
    List<DocumentationRecord> getAllTopics();
}

我只能得到这样的记录:

[
  [
    "youngChild topic",
    317
  ],
  [
    "oldChild topic",
    318
  ],
  [
    "child topic",
    319
  ],
]

我不希望获得具有属性ID和主题的对象数组。实现这一目标的最好方法是什么?


问题答案:

在Spring Data JPA中,您可以使用投影:

基于接口

public interface IdAndTopic {
    Long getId();
    String getTopic();
}

基于类 (DTO):

@Value // Lombok annotation
public class IdAndTopic {
   Long id;
   String topic;
}

然后在您的仓库中创建一个简单的查询方法:

public interface DocumentationRecordRepository extends CrudRepository<DocumentationRecord, Long> {

    List<IdAndTopic> findBy();
}

您甚至可以创建动态查询方法:

List<T> findBy(Class<T> type);

然后像这样使用它:

List<DocumentationRecord> records = findBy(DocumentationRecord.class);
List<IdAndTopic> idAndTopics = findBy(IdAndTopic.class);


 类似资料:
  • 我有这样的物体: 现在我只想获取主题和id。有没有办法以这样的格式获取它: 因为即使只使用这个查询 我只能得到这样的记录: 我不喜欢数组的数组,我想获得具有属性id和主题的对象数组。实现这一目标的最佳方式是什么?

  • 我正在尝试使用HikariCP连接池。我能够让它工作,并获得一个我可以使用的连接。我不确定将连接返回到池的最佳方法是什么。 我有以下问题: 我是否应该在完成后关闭连接,依赖idleTimeout和maxLifetime设置,或者是否可以使用另一个调用来避免占用池中的连接 如果我关闭连接(而不是返回池),是否会创建其他连接对象以满足连接池大小的要求 寻找有用的建议。

  • 问题内容: 我正在尝试选择多个字段,其中一个字段需要是一个数组,该数组的每个元素都包含 两个 值。每个数组项都需要包含一个名称(字符不同)和一个ID(数字)。我知道如何返回单个值的数组(使用关键字),但是我不确定如何返回本身包含两个值的对象的数组。 查询就像 我读到一种实现此目的的方法是,将值选择为一个类型,然后创建该类型的数组。问题是,该函数的其余部分已经返回了一个类型(这意味着我将拥有嵌套的类

  • 问题内容: 这是一个小问题,因为我可以轻松地参加一对班做这项工作。我并不是真的想要这样做,我觉得应该有一些简单的,内置的,类似于Java的方法来返回两个值。你们最好的,最简单的方法是什么?数组?其他一些数据结构? 问题答案: 据我所知,不幸的是在Java中没有对的内置表示(我当然希望有)。就个人而言,当我编写一个项目时发现配对类经常很有用时,我会创建一个通用类(这可能是您在想的)。返回数组是一种快

  • 问题内容: 我有一个说“销售”的对象列表。我只需要其产品与另一个列表(例如saleProductList)中的对象匹配的Sales对象。 除了循环以外,还有没有更好的方法可以做到这一点。 问题答案: 如果您已经在使用Google的Guava库,则它具有Collections2.filter()方法,该方法将仅返回集合中与给定Predicate匹配的项。 但是,这是否能回答您的问题取决于您避免循环的

  • 问题内容: 我正在使用restTemplate向servlet发出请求,该servlet返回json中对象的非常简单的表示形式。 我有一个包含这两个字段的DTO以及相应的设置器和获取器。我想知道的是如何使用json响应创建对象,而不必“解析”响应。 问题答案: 我个人会推荐杰克逊。它相当轻巧,速度非常快,只需要很少的配置。这是反序列化的示例: