[英]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 投影而不使用查詢投影,所以我給出了 DTO 投影的示例,但是如果通過上述文檔,可以很好地參考如何使用每個抽象/功能。
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_id
和mobile
使用構造函數,並在 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.