如何在 Spring Boot JPA 中获取选择性列?

Sou*_*ade 1 java spring jpa spring-data-jpa spring-boot

我是 Spring Boot 新手。

我有两个实体“邀请”和“用户”。

@Entity
public class Invite {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(name="email")
    private String email_id;
    private String mobile;
    private String pincode;
    private String name;
    private String status;
    private Date created_on;
    private Date updated_on;
 
    //gettes and setters
}


@Entity
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private int id;
    
    @OneToOne
    private Invite invite;
    private String firstName;
    private String LastName;
    @JsonIgnore
    private String password;
    private Date created_on;
    private Date updated_on;

    // getters and setters

}
Run Code Online (Sandbox Code Playgroud)

我想要以下数据

+---------+---------------------------------------------+
|  id     |   firstName    email_id         mobile      |
+-------------------+------------+----------------------+
|         |         |            |                      |
| 1       |Ram      | s@mail.com |      1111111111      |
|         |         |            |                      |
+---------+---------+------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

所以我在 UserRepository 中创建了以下查询:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

    
    @Query("select u.id,u.firstName,i.email_id, i.mobile from User u inner join u.invite i")
    public List<User> getUserDetails();
}
Run Code Online (Sandbox Code Playgroud)

所以我收到以下错误 -

Failed to convert from type [java.lang.Object[]] to type [@org.springframework.data.jpa.repository.Query com.example.jpa.JPA.entity.User] for value
Run Code Online (Sandbox Code Playgroud)

我知道这是因为返回值是 Object 类型,并且我正在尝试将其获取到 user.

您能否给我一种无需创建额外的 DTO 类或接口即可获取任何数据的方法?

Pri*_*Dey 5

很高兴您已经知道问题所在。

@Query("select u.id,u.firstName,i.email_id, i.mobile from User u inner join u.invite i")
List<User> getUserDetails();
Run Code Online (Sandbox Code Playgroud)

您选择了几列,但要求 Data-Jpa 返回用户对象列表。

因此,您首先需要了解 JPA 规范中关于使用 JPQL 的内容。

  • select u from User u where u.id = :id-> 这会返回一个User对象类型列表 本机中的此查询是:SELECT * FROM USER WHERE ID = "{whatever value you passed}";

  • select u.username from User u where u.id = :id"-> 这仅返回用户名,可以说是 String 类型。因此,如果您使用TypedQuery,则返回对象类型为 String 类型;如果您使用Query ,则返回 Object 。对应生成的SQL为SELECT u.USERNAME FROM USER u WHERE u.id = {id}

  • select u.id, u.username from User u where u.id = :id-> 这将返回 Object[]。这时您需要 DTO 投影将其映射到您想要的正确类型。

通过本机 JPA 实现,您可以使用DTO 投影查询投影

我主要使用 JPA 规范中的 DTO 投影,而不是使用查询投影,因此我给出了 DTO 投影的示例,但上面的文档(如果仔细阅读)给出了如何使用每个抽象/功能的良好参考。

  1. 定义一个类来表示我正在考虑的 DTO 和包:com.example。包名称很重要,因为您需要完整的类名称以供在 JPQL 中引用
package com.example;


class UserDTO {
 int id;
 String firstName,
 String email_id;
 String mobile;

 //All args constructor is needed and madatory
public User(int id, String firstName, String email_id, String mobile) {
 // assignments
}
  // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

在存储库中:

@Query("select new com.example.UserDTO(u.id,u.firstName,i.email_id, i.mobile) from User u inner join u.invite i")
List<UserDTO> getUserDetails();
Run Code Online (Sandbox Code Playgroud)

最重要的是:新的完全限定类名(您正在获取的所有列)

这就是将 DTO 投影与 JPQL 和 Data Jpa Repository 结合使用的方式。