【问题标题】:Spring Boot JPA returns List of List not List of ObjectSpring Boot JPA 返回列表列表而不是对象列表
【发布时间】:2020-07-17 23:49:31
【问题描述】:

我是 Spring Boot jpa 的新手。我想将返回类型设为 List,但我得到的只是 List

我的实体类

@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);
  }
}

【问题讨论】:

    标签: spring spring-boot spring-data-jpa


    【解决方案1】:

    关于你的代码的几点:

    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&lt;User, String&gt; 创建存储库,但在您的类中User id 不是String 类型。考虑将 ID 字段设为字符串。

    方法是findEmails,但它返回的是List&lt;User&gt;?我希望这样的函数能够返回List&lt;String&gt;——每个字符串当然是一封电子邮件。您可以考虑重命名此函数以避免将来混淆。不过没什么大不了的。

    在您的查询中:

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

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

    【讨论】:

      【解决方案2】:

      我非常同意 Fermi-4 的建议。使用更好的命名约定是拥有更易于管理的代码的关键。你应该跟随他们。要解决您的问题,只需执行以下操作即可解决您的问题。

         public interface UserRepository extends JpaRepository<User, long> {
      
      
        public List<User> findByFname(String fName);
      
       }
      

      另外,请考虑更改 USER 实体定义以添加可序列化实现,如下所示

          @Component
          @Entity
          @Table(name = "USERDB.USERS")    
          public class User implements Serializable{
      
      /**
       * 
       */
      private static final long serialVersionUID = 3L;
      

      【讨论】:

        【解决方案3】:
        1. 创建额外的 User 构造函数,只使用您希望从表中获取的几个参数
        public User(long id, String fName, String lastName, String email) {
            this.id = id;
            this.fName = fName;
            this.lastName = lastName;
            this.email = email;
        }
        
        1. 如下调整 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);
        

        用你的User的实际包替换com.package

        【讨论】:

          猜你喜欢
          • 2018-08-08
          • 2012-06-23
          • 1970-01-01
          • 2018-12-18
          • 1970-01-01
          • 2021-07-05
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          相关资源
          最近更新 更多