CrudRepository按属性检索数据?

时间:2018-06-11 12:38:21

标签: java jpa spring-data-jpa

如何通过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){

}

1 个答案:

答案 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);
}

但是,请考虑您可能希望同时查询用户以获取更多属性的情况。例如,如果您想按firstNamelastNamegenderphoneNumber找到用户,那么就无法为各种组合编写方法

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