Spring Boot JPA возвращает список списка, а не список объектов - PullRequest
0 голосов
/ 06 апреля 2020

Я новичок в весенней загрузке 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);
  }
}

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Я очень согласен с предложением 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;
0 голосов
/ 06 апреля 2020
  1. Создайте дополнительный конструктор User с несколькими аргументами, которые вы sh извлечете из таблицы
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

0 голосов
/ 06 апреля 2020

Несколько пунктов в вашем коде:

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 идентификатор не относится к типу String. Попробуйте сделать поле идентификатора строкой.

Метод 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)")

Это должно исправить проблему с сериализацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...