如何通过attribue开发方法泛化来检索数据让我们说有用户类
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);
}
我想通过attribue开发一种方法来检索数据:
findUsersByAttributes(String attribue){
}
答案 0 :(得分:0)
您已经提供了您的实体,但我添加了缺失的注释,以便任何jpa实现都可以选择它。这里只是一个快速提醒,每当您存储密码时,您应该考虑散列密码,而不是将它们作为明文存储在数据库中。您可以找到有关此here的更多信息。
@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 或规范< / em>,它完全解决了这个问题。有关此here的更多信息。
接下来,您应该创建一个服务来解耦数据层。
@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。