我是spring boot jpa的新手。我想将返回类型作为列表,但是我只得到列表
我的实体类别
@Component
@Entity
@Table(name = "USERDB.USERS")
public class User() {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
@SequenceGenerator(sequenceName = "MY_SEQ_NAME", allocationSize = 1), name = "MY_SEQ")
@Column(name = "userId")
private long id;
@Column(name = "firstName")
private String fName;
@Column(name = "midName")
private String mName;
@Column(name = "lastName")
private String lName;
@Column(name = "email")
private String email;
@Column(name = "createdDate")
private Timestamp createdOn;
public User() {
this.createdOn = new Timestamp(System.currentTimeMillis()
}
//SETTERS & GETTERS
}
我的存储库;
public interface UserRepository extends JpaRepository<User, String> {
@Query("SELECT id fName, lastName, email FROM User u WHERE u.fName=(:fName)")
public List<User> findByEmail(@Param("fName") String fName);
}
我想要的是获得一个JSON响应作为具有键值对的User Array,如下所示
[
[
"id": 1001,
"fName": John",
"lName": "Doe",
"email": "[email protected]"
],
[
"id": 1002,
"fName": "John",
"lName": "Simmons",
"email": "[email protected]"
],
]
但是我得到的列表中只有如下值。
[
[
1001,
"John",
"Doe",
"[email protected]"
],
[
1002,
"John",
"Simmons",
"[email protected]"
],
]
我不确定我在哪里做错了,或者我应该怎么做?这是我实际程序的一个假设示例。请原谅我任何错误。
这是我的控制器类
@Restcontroller
public class UserController {
@Autowired
UserRepository repo;
@GetMapping("/user/{fname}")
public List<User> getUserByName(
@PathVariable("fname") String fname) {
return repo.findByEmail(fname);
}
}
public interface UserRepository extends JpaRepository<User, String> {
Query("SELECT id fName, lastName, email FROM User u WHERE u.fName=(:fName)")
public List<User> findEmails(@Param("fName") String fName);
}
您正在使用JpaRepository<User, String>
创建存储库,但是在您的类User
中,id不是String
类型。考虑将ID字段设置为字符串。方法是
findEmails
,但它返回的是List<User>
?我希望这样的函数返回List<String>
-当然每个字符串都是一封电子邮件。您可以考虑重命名此功能,以避免将来造成混乱。不过没什么大不了的。在您的查询中:
@Query("SELECT id fName, lastName, email FROM User u WHERE u.fName=(:fName)")
您应将其更改为:
@Query("SELECT u.id u.fName, u.lastName, u.email FROM User u WHERE u.fName=(:fName)")
这应该解决您遇到的序列化问题。
public interface UserRepository extends JpaRepository<User, long> {
public List<User> findByFname(String fName);
}
此外,请考虑更改用户实体定义以添加如下可序列化的实现
@Component @Entity @Table(name = "USERDB.USERS") public class User implements Serializable{ /** * */ private static final long serialVersionUID = 3L;
User
构造函数public User(long id, String fName, String lastName, String email) {
this.id = id;
this.fName = fName;
this.lastName = lastName;
this.email = email;
}
调整如下的JP查询
@Query("SELECT new com.package.User(u.id, u.fName, u.lastName, u.email) FROM User u WHERE u.fName = :fName")
public List<User> findByEmail(@Param("fName") String fName);
用com.package
的实际包装替换User