簡體   English   中英

如何在 spring 引導 JPA 中獲得選擇性列?

[英]How to get selective column in spring boot JPA?

我是 spring 引導的新手。

我有兩個實體 Invite 和 User。

@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

}

我想要以下數據

+---------+---------------------------------------------+
|  id     |   firstName    email_id         mobile      |
+-------------------+------------+----------------------+
|         |         |            |                      |
| 1       |Ram      | s@mail.com |      1111111111      |
|         |         |            |                      |
+---------+---------+------------+----------------------+

所以我在 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();
}

所以我收到以下錯誤 -

Failed to convert from type [java.lang.Object[]] to type [@org.springframework.data.jpa.repository.Query com.example.jpa.JPA.entity.User] for value

我知道這是因為返回值的類型是 Object 並且我正試圖將其輸入用戶。

您能否給我一種在不創建額外 DTO 類或接口的情況下獲取任何數據的方法?

太好了,您已經知道問題所在。

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

您正在選擇幾列,但要求 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 類型。因此返回 object 類型是 String 類型,以防您使用TypedQuery或 Z49720345B5991514AC5A如果您使用Query . 生成的相應 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 投影到 map 的時候,它是您想要的正確類型。

使用本機 JPA 實現,您可以使用DTO 投影查詢投影

我主要使用 JPA 規范中的 DTO 投影而不使用查詢投影,所以我給出了 DTO 投影的示例,但是如果通過上述文檔,可以很好地參考如何使用每個抽象/功能。

  1. 定義一個 class 來表示 DTO 和 package 我正在考慮:com.example。 Package 名稱很重要,因為您需要完整的 class 名稱以供在 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
}

在存儲庫中:

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

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

這就是您如何將 DTO 投影與 JPQL 和數據 Jpa 存儲庫一起使用。

User class 中為您的選擇列編寫一個構造函數並在查詢中使用。 確保您還在Invite class 中為email_idmobile使用構造函數,並在 User 的構造函數中使用它。

@Query("select new com.example.jpa.JPA.entity.User(u.id,u.firstName,i.email_id, i.mobile) from User u inner join u.invite i")
public List<User> getUserDetails();

在用戶中使用此構造函數並邀請 class

public User(int id, String firstName, String email_id, String mobile) {
 // assign id and firstName
 // call invite class constuctor 
}

public Invite(String email_id, String mobile) {
 // assign email_id and mobile
}

如果您想在查詢結果中選擇字段或自定義查詢結果,您可以簡單地使用jpa Projection 創建具有相關屬性方法的接口

try this..this work for me: spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy

這將被添加到 application.properties

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM