一、什么是JPA
它是SUN公司提出的ORM规范
JDBC的接口是各种数据库来实现的,在JPA中实体类和表一一对应,通过ORM框架生成的SQL还是得使用JDBC去操作数据库。
JPA就类似于一个翻译器
二、queryDsl
配置:Spring boot JPA+Gradle+QueryDSL 完美配置生成Q文件依赖_spring boot使用 gradle 整合 jpa querydsl-jpa-优快云博客
1.语句
①实现QueryDslPredicateExecutor
Querydsl扩展能让我们以链式方式代码编写查询方法。该扩展需要一个接口QueryDslPredicateExecutor,它定义了很多查询方法。Repository实现这个接口,可以进行链式编程。
等于 EQ : equal .eq
不等于 NE : not equal .ne
小于 LT : less than .lt
大于 GT : greater than .gt
小于等于 LE : less than or equal .loe
大于等于 GE : greater than or equal .goe
@Autowired
CustomerDslRepository repository;
@Test
public void test02(){
QCustomer qCustomer = QCustomer.customer;
Iterable<Customer> all = repository.findAll(qCustomer.id.in(1L,5L)
.and(qCustomer.firstName.in("徐庶", "王五")));
System.out.println(all);
}
②自定义查询
创建factory工厂
@Configuration
public class SpringDataJPAConfig {
@Bean
public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
return new JPAQueryFactory(entityManager);
}
}
自定义语句:
private final JPAQueryFactory jpaQueryFactory;
@Test
public void test01(){
QCustomer qCustomer = QCustomer.customer;
QueryResults<Tuple> tupleQueryResults = queryFactory
.select(qCustomer.id.sum(), qCustomer.id)
.from(qCustomer)
.where(qCustomer.id.between(1, 2))
.orderBy(qCustomer.id.desc())
.groupBy(qCustomer.id)
.fetchResults();
for (Tuple result : tupleQueryResults.getResults()) {
System.out.println(result.get(qCustomer.id));
System.out.println(result.get(qCustomer.id.sum()));
}
}
@Test
public void test02(String custName){
QCustomer qCustomer = QCustomer.customer;
System.out.println(jpaQueryFactory
.select(qCustomer)
.from(qCustomer)
.where(qCustomer.custName.eq(custName))
.fetchFirst());
}
2.多表操作
一对一,OneToOne
注意注释中的配置信息
多对一:ManyToOne
当插入“多”的数据时,使用多对一的关联关系更合适
通过”一“的数据进行条件查询时,使用一对多的关联关系更合适
通过“多”的数据状态进行条件查询时,使用多对一的关联关系更合适
联想用户和订单表的关系