【问题标题】:How to return specific object attributes in spring boot queries with DAO?如何使用 DAO 在 Spring Boot 查询中返回特定对象属性?
【发布时间】:2021-02-15 10:57:38
【问题描述】:

在我的 Spring Boot 应用程序中,我有一个名为 Person.class 的实体,其中包含

long id;
String email;
String name;
String surname;
String address;

在DAO类中,我有一个方法:

List<Person> findAllByEmail(String email);

查询数据库并返回人员列表。

我想返回一个仅包含一些属性的 Person 列表,例如:

long id;
String email;

不返回整个对象。

这相当于执行查询:

"select id, email from person where email = ?"

但我想将函数查询保存到DAO中

List<Person> findAllByEmail(String email);

无需手动编写查询。

我该怎么做?

【问题讨论】:

  • 我不确定这有什么关系,如果您在代码中使用它,那么没关系。但是如果你想把它返回到前端,那么你绝对不能直接使用模型类。参考this Entity to DTO conversion
  • 您可以简单地调用对象的必填字段。

标签: java spring spring-boot api dao


【解决方案1】:

您可以使用JPA Projections

  1. 使用所需列的 getter 创建接口
interface WithIdAndEmail {
   long getId();
   String getEmail();
}
  1. 将该接口用作方法的返回类型
List<WithIdAndEmail> findAllByEmail(String email);

【讨论】:

  • 好的,谢谢!在哪里添加接口?进入 Person 类?
  • @user3476509 随心所欲。我更喜欢将它放在相关的存储库类附近
  • 我收到错误:无法写入 JSON:无法从类型 [java.lang.String] 转换为类型 [long]
  • @user3476509 尝试使用Long 而不是long。虽然我不明白为什么它甚至被转换成 JSON
  • @user3476509 如果解决了你可以接受我的回答
【解决方案2】:

不可能从一个方法返回多个值。在您的调用方法中,当迭代返回的List&lt;Person&gt; 时,您应该将List 中每个Person 中的必填字段读入局部变量并使用它们。

【讨论】:

  • 我想返回对象 Person,但只有属性 id 和 email。
  • 如果您处理Person 的实例,它始终包含所有字段。这些字段是否真的包含有用的信息是另一回事。但是您不能从类中删除字段。有关使用不同结构的方法,请参阅 Nikolai 的回答。
猜你喜欢
  • 2022-07-01
  • 2010-11-12
  • 2022-10-19
  • 1970-01-01
  • 2017-12-19
  • 2019-10-19
  • 2017-06-02
  • 2022-11-02
  • 2023-04-02
相关资源
最近更新 更多