Сущность
Вы уже указали свою сущность, но я добавил недостающие аннотации, чтобы она могла быть подхвачена любой реализацией jpa.Просто быстрое напоминание: всякий раз, когда вы храните пароль, вы должны учитывать хеширование паролей, а не сохранять их в виде открытого текста в вашей базе данных.Вы можете найти более подробную информацию об этом здесь .
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private Long id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "firstName")
private String firstName;
@Column(name = "lastName")
private String lastName;
// remainer ommitted for brevity
}
Репозиторий
Самый простой вариант - создать методы с использованием Spring Data JPA.
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
Optional<User> findOneByUsername(String username);
List<User> findAllByFirstName(String firstName);
List<User> findAllByLastName(String lastName);
}
Однако рассмотрим случай, когда вам может потребоваться запросить у пользователей дополнительные атрибуты одновременно.Например, если вы хотите найти пользователя по firstName
, lastName
, gender
, phoneNumber
, ... было бы невозможно написать методы для всех видов комбинаций.
findAllByFirstNameAndLastNameAndGenderAndPhoneNumber // pretty confusing
Если вам нужно только несколько свойств, вы можете использовать CrudRepository
, как указано выше, если вам нужно больше свойств, вы можете захотеть взглянуть на QueryDSL или Спецификации , которыеиметь дело именно с этой проблемой.Подробнее об этом здесь .
Служба
Далее вы должны создать службу для развязки слоя данных.
@Service
public class UserService {
private UserRepository repository;
@Autowired
public UserService(UserRepository repository) {
this.repository = repository;
}
Optional<User> findOneByUsername(String username) {
return repository.findOneByUsername(username);
}
List<User> findAllByFirstName(String firstName) {
return repository.findAllByFirstName(firstName);
}
List<User> findAllByLastName(String lastName) {
return repository.findAllByLastName(lastName);
}
}
Контроллер
Наконец, создайте контроллер для доступа к вашему сервисному уровню.
@RestController
@RequestMapping("/users")
public UserController {
private UserService service;
@Autowired
public UserController(UserService service) {
this.service = service;
}
@GetMapping()
@ResponseBody
public List<User> findAll(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "firstName", required = false) String firstName,
@RequestParam(value = "lastName", required = false) String lastName) {
if (username != null) {
return List.of(service.findOneByUsername(username));
}
if (firstName != null) {
return service.findAllByFirstName(username);
}
if (lastName!= null) {
return service.findAllByLastName(username);
}
return service.findAll();
}
}
Последнее замечание: подумайте, хотите ли вы сделать поле пароля доступным и в запросах, если нет, я бы порекомендовалиспользуя UserDTO и ModelMapper .