CrudRepository получать данные по атрибутам? - PullRequest
0 голосов
/ 11 июня 2018

Как разработать общий метод для извлечения данных по атрибуции, скажем, есть класс пользователя

public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String password;
private String firstName;
private String lastName;

}

UserRepository

public interface  UserRepository  extends CrudRepository<User, Long> {

    Optional<User> findOneByUsername(String username);
    Optional<User> findUsersByAttributes(String attribute);

}

Я хочу разработать один метод для извлечения данных по атрибуции:

findUsersByAttributes(String attribue){

}

1 Ответ

0 голосов
/ 13 июня 2018

Сущность

Вы уже указали свою сущность, но я добавил недостающие аннотации, чтобы она могла быть подхвачена любой реализацией 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 .

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