我是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响应,作为一个带有键值对的用户数组,如下所示
[
[
"id": 1001,
"fName": John",
"lName": "Doe",
"email": "johnd@example.com"
],
[
"id": 1002,
"fName": "John",
"lName": "Simmons",
"email": "johns@example.com"
],
]
但是我得到了一个列表,其中只包含下面的值。
[
[
1001,
"John",
"Doe",
"johnd@example.com"
],
[
1002,
"John",
"Simmons",
"johns@example.com"
],
]
我不确定我做错了什么,或者这是我应该得到的结果吗?这是我的实际程序的一个假设示例。如果有任何错误,请原谅。
下面是我的控制器类
@Restcontroller
public class UserController {
@Autowired
UserRepository repo;
@GetMapping("/user/{fname}")
public List<User> getUserByName(
@PathVariable("fname") String fname) {
return repo.findByEmail(fname);
}
}
发布于 2020-04-06 10:45:44
关于你的代码有几点:
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)")
这应该可以解决您所遇到的序列化问题。
发布于 2020-04-06 14:03:12
我非常同意费米-4的建议。使用更好的命名约定是拥有更好的、易于管理的代码的关键。你应该跟随他们。要解决您的问题,只需执行以下操作,它将解决您的问题。
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;
发布于 2020-04-06 17:46:15
User
构造函数,其中只有几个要从表中提取的参数
public User(long id, String fName, String lastName, String email) {
this.id = id;
this.fName = fName;
this.lastName = lastName;
this.email = email;
}
@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);
用User
的实际包替换com.package
https://stackoverflow.com/questions/61052032
复制相似问题