1:可以使用原生态的sql语句查询数据库
@Query(value = "select meetings.* FROM tenant\n" +
"LEFT JOIN meeting_domain_binding ON tenant.id = meeting_domain_binding.tenant_id\n" +
"LEFT JOIN meetings ON meeting_domain_binding.id = meetings.meeting_domain_binding_id\n" +
"WHERE tenant.id = ?1",nativeQuery = true)
List<Meeting> findByTenantId(String id);
需要加上@Query注解,nativeQuery属性表示是否使用原生态sql,默认情况下是false。
在使用这个sql的时候还遇到过很多的坑,建议还是不要使用别名;查询的时候用*而不要用表中的一个属性。我之前只查了meetings的name,但是报了tenant.id没有找到。改成*之后就好了
2:如果需要修改数据的话
1:使用@Query注解
2:使用@Modifying注解
3:动态分页查询
需要对象:Sort 用来排序
PageRequest 用来分页
Specification 拼接查询语句
dao层:
public interface UserRepository extends JpaRepository<User,Long>,JpaSpecificationExecutor<User>{
}
service层:
@Service("userServiceImpl")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public List<User> findUsers(User user, int currentPage, int pageSize) {
Sort sort = new Sort(Sort.Direction.DESC,"age");
PageRequest pageRequest = PageRequest.of(currentPage,pageSize,sort);
Specification<User> queryCondition = new Specification<User>() {
@Nullable
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
if (user.getNickname() != null && user.getNickname().isEmpty()){
predicates.add(cb.like(root.get("nickname"),user.getNickname() + "%"));
}
if (user.getAge() != 0){
predicates.add(cb.greaterThan(root.get("age"),20));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
List<User> users = userRepository.findAll(queryCondition,pageRequest).getContent();
return users;
}
}
运行结果:
[
{
"id": 3,
"nickname": "李四",
"mobile": "56",
"age": 54
},
{
"id": 2,
"nickname": "张三",
"mobile": "5456143251",
"age": 32
},
{
"id": 4,
"nickname": "子龙",
"mobile": "186376859----",
"age": 21
}
]