用jpa写一个动态查询代码
时间: 2023-06-13 13:04:47 浏览: 54
首先,需要定义一个接口,继承`JpaRepository`,并使用`@Repository`注解标识为一个Spring的仓库:
```java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
```
其中,`User`是实体类,`Long`是实体类的主键类型。
然后,可以使用`Specification`来动态生成查询条件。`Specification`是一个接口,需要自己实现其中的`toPredicate`方法来生成查询条件。
例如,查询用户名(`username`)为`admin`的用户:
```java
Specification<User> spec = new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.equal(root.get("username"), "admin");
}
};
List<User> users = userRepository.findAll(spec);
```
如果需要查询用户名为`admin`且年龄(`age`)大于等于`18`的用户:
```java
Specification<User> spec = new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate p1 = cb.equal(root.get("username"), "admin");
Predicate p2 = cb.greaterThanOrEqualTo(root.get("age"), 18);
return cb.and(p1, p2);
}
};
List<User> users = userRepository.findAll(spec);
```
还可以使用`Pageable`来实现分页查询。例如,查询第2页,每页10条记录的用户:
```java
Pageable pageable = PageRequest.of(1, 10);
Page<User> usersPage = userRepository.findAll(spec, pageable);
List<User> users = usersPage.getContent();
```