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 类或接口即可获取任何数据的方法?
很高兴您已经知道问题所在。
@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 投影,而不是使用查询投影,因此我给出了 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
}
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 结合使用的方式。
| 归档时间: |
|
| 查看次数: |
955 次 |
| 最近记录: |