Spring Boot JPA返回列表列表而不是对象列表

问题描述 投票:0回答:3

我是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);
  }
}
spring spring-boot spring-data-jpa
3个回答
0
投票
您的代码上的几点:

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)")

这应该解决您遇到的序列化问题。


0
投票
我非常同意Fermi-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;


0
投票
    仅使用您希望从表中获取的少量参数创建附加的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
  • © www.soinside.com 2019 - 2024. All rights reserved.