自定义操作
jpql(原生SQL)
a.@Query
i. 查询如果返回单个实体 就用pojo接收 , 如果是多个需要通过集合 ii. 参数设置方式
- 索引 : ?数字
- 具名: :参数名 结合@Param注解指定参数名字
iii. 增删改: - 要加上事务的支持:
- 如果是插入方法:一定只能在hibernate下才支持 (Insert into
…select )
@Transactional // 通常会放在业务逻辑层上面去声明
@Modifying // 通知springdatajpa 是增删改的操作
规定方法名
支持的查询方法主题关键字(前缀) 决定当前方法作用 只支持查询和删除
支持的查询方法谓词关键字和修饰符
决定查询条件
Query by Example
b. 只支持查询
i.不支持嵌套或分组的属性约束,如 firstname = ?0 or (firstname = ?1 and lastname = ?2).
ii.只支持字符串 start/contains/ends/regex 匹配和其他属性类型的精确匹 配。
实现:
1.将Repository继承QueryByExampleExecutor
public interface CustomerQBERepository extends
PagingAndSortingRepository<Customer,Long>, QueryByExampleExecutor<Customer> {
}
@Test
public void test01(){
Customer customer = new Customer();
customer.setCustName("张三");
Example<Customer> example = Example.of(customer);
System.out.println(repository.findAll(example));
}
@Test
public void test02(){
Customer customer = new Customer();
customer.setCustAddress("beijing");
// 匹配器, 去设置更多条件匹配
ExampleMatcher matcher = ExampleMatcher.matching()
.withIgnoreCase("custAddress");
Example<Customer> example = Example.of(customer,matcher); System.out.println(repository.findAll(example));
}
Specifications
在之前使用Query by Example只能针对字符串进行条件设置,那如果希望对所有类型支持,可以使用Specifications
实现
1.继承接口JpaSpecificationExecutor
1 public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
2 …
3 }
2.传入Specification的实现: 结合lambda表达式
1repository.findAll((Specification<Customer>)
2(root, query, criteriaBuilder) ‐>
3 {
4 // Todo...
5 return null;
6 });
7 }
Root:查询哪个表(关联查询) = from
CriteriaQuery:查询哪些字段,排序是什么 =组合(order by . where ) CriteriaBuilder:条件之间是什么关系,如何生成一个查询条件,每一个查询条件都是什么类型(>
between in…) = where
Predicate(Expression): 每一条查询条件的详细描述
List<Customer> list = repository.findAll((Specification<Customer>)
(root, query, criteriaBuilder) ‐>
{
Order weightOrder = criteriaBuilder.desc(root.get("custId"));
CriteriaBuilder.In<Object> id = criteriaBuilder.in(root.get("custId"));
id.value(1).value(7);
return query.orderBy(weightOrder).where(id).getRestriction();
});
限制:
不能分组、聚合函数, 需要自己通过entityManager玩