Spring Date JPA -自定义操作[Query by Example,Specifications]

自定义操作

jpql(原生SQL)

a.@Query
i. 查询如果返回单个实体 就用pojo接收 , 如果是多个需要通过集合 ii. 参数设置方式

  1. 索引 : ?数字
  2. 具名: :参数名 结合@Param注解指定参数名字
    iii. 增删改:
  3. 要加上事务的支持:
  4. 如果是插入方法:一定只能在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> {
23  }

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玩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值