1. Введение в Querydsl-JPA:
Springdata-JPA — это инкапсуляция JPA. Querydsl-JPA — это также общая структура запросов, основанная на различных ORM. как sql. Что еще более важно, он может создавать безопасные для типов запросы, что сильно отличается от того, когда JPA использует собственные запросы, и мы больше не можем работать с отвратительным «Объектом []». Конечно, мы можем использовать SpringDataJPA + Querydsl-JPA в комбинации, и они имеют идеальную взаимную поддержку для достижения более эффективного кодирования.
官网地址:http://www.querydsl.com/
gitub地址:https://github.com/querydsl/querydsl/tree/master/querydsl-jpa
2. Конфигурация загрузки Spring Querydsl-JPA:
2.1: Новая упаковка баночки:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
2.2: Новые плагины:
Функция: генерировать Q-версию класса сущностей для класса сущностей, аннотированного с помощью @Entity.
<!-- query dsl 构建Q版实体类的插件-->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
2.3: Конфигурация JPAQueryFactory:
Функция: при использовании функции QueryDSL это будет зависеть от использования JPAQueryFactory, а JPAQueryFactory зависит от использования здесь EntityManager, поэтому выполните следующую настройку в основном классе, чтобы Spring мог автоматически помочь нам внедрить EntityManager и автоматически управлять JPAQueryFactory
import javax.persistence.EntityManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.querydsl.jpa.impl.JPAQueryFactory;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public JPAQueryFactory jpaQuery(EntityManager entityManager) {
return new JPAQueryFactory(entityManager);
}
}
2.4: Использование инъекции бина:
@Autowired
private JPAQueryFactory jpaQueryFactory;
2.5: операция сборки maven:
3. Операция с одной таблицей Querydsl-JPA:
3.1 Новый класс объектов:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.math.BigDecimal;
import java.sql.Timestamp;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(name = "user_tmw")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid", strategy = "com.springboot.demo.bean.CustomUUIDGenerator")
@Column(name = "id", nullable = false, length = 32)
private String id;
@Column(name = "name", length = 10)
private String name;
@Column(name = "age")
private Integer age;
@Column(name = "money")
private BigDecimal money;
@Column(name = "begin_time")
private Timestamp beginTime;
@Column(name = "end_time")
private Timestamp endTime;
}
3.2 Набор результатов, равный значению:
QUser user = QUser.user;
//单表获取年龄为10的结果集
List<User> ageList = jpaQueryFactory.selectFrom(user).where(user.age.eq(10)).fetch();
String ageListStr = JSON.toJSONString(ageList);
System.out.println("单表获取年龄为10的结果集:"+ageListStr);
3.3 Использование запроса одного :fetchFirst, равного определенному значению:
QUser user = QUser.user;
//fetchFirst的用法: 单表获取年龄为10的首个结果
User user1 = jpaQueryFactory.selectFrom(user).where(user.age.eq(10)).fetchFirst();
System.out.println("单表获取年龄为10的首个结果:"+user1.toString());
3.4 Использование 1 нечеткого поиска (например, ключевое слово):
QUser user = QUser.user;
//模糊检索的用法:单表获取名称包含小的用户并且按照年龄倒排序
List<User> nameList = jpaQueryFactory.selectFrom(user).where(user.name.like("%小%")).orderBy(user.age.desc()).fetch();
String nameListStr = JSON.toJSONString(nameList);
System.out.println("单表获取名称包含小的用户并且按照年龄倒排序的结果集:"+nameListStr);
3.5 Использование нечеткого поиска 2 (startsWith):
QUser user = QUser.user;
//模糊检索的用法:单表获取名称是以小开头的用户并且按照年龄正序排
List<User> nameAscList = jpaQueryFactory.selectFrom(user).where(user.name.startsWith("小")).orderBy(user.age.asc()).fetch();
String nameAscListStr = JSON.toJSONString(nameAscList);
System.out.println("单表获取名称是以小开头的用户并且按照年龄正序排的结果集:"+nameAscListStr);
3.6 Интервал использования (между):
QUser user = QUser.user;
//between 区间的用法:单表获取开始时间是XX-XX 区间的用户
String time = "2019-07-22 00:00:00";
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date= df.parse(time);
Timestamp nousedate = new Timestamp(date.getTime());
String time1 = "2019-07-23 00:00:00";
Date date1= df.parse(time1);
Timestamp nousedate1 = new Timestamp(date1.getTime());
List<User> beginTimeList = jpaQueryFactory.selectFrom(user).where(user.beginTime.between(nousedate, nousedate1)).fetch();
String beginTimeListStr = JSON.toJSONString(beginTimeList);
System.out.println("单表获取开始时间是XX-XX 区间的用户的结果集:"+beginTimeListStr);
3.7 в использовании:
QUser user = QUser.user;
//in 的用法:单表获取年龄是10,20的用户
List<Integer> ageLists = new ArrayList<>();
ageLists.add(10);
ageLists.add(20);
List<User> ages = jpaQueryFactory.selectFrom(user).where(user.age.in(ageLists)).fetch();
String agesStr = JSON.toJSONString(ages);
System.out.println("单表获取年龄是10,20的用户的结果集:"+agesStr);
3.8 Использование агрегатных функций max, avg, min:
QUser user = QUser.user;
//聚合函数-concat()的使用:单表查询将用户id,名称,年龄拼接的结果
List<String> concatList = jpaQueryFactory.select(user.id.concat(user.name).concat(user.age.stringValue())).from(user).fetch();
String concatListStr = JSON.toJSONString(concatList);
System.out.println("单表查询将用户id,名称,年龄拼接的结果:"+concatListStr);
3.9 Использование агрегатной функции groupby:
QUser user = QUser.user;
List<Map<String,Object>> tupleJPAQuery = jpaQueryFactory.select(user.age, user.count().as("count")).from(user).groupBy(user.age)
.fetch().stream().map(x->{
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("age",x.get(0,QUser.class));
resultMap.put("count",x.get(1,QUser.class));
return resultMap;
}).collect(Collectors.toList());
String userQueryResultsStr = JSON.toJSONString(tupleJPAQuery);
System.out.println("单表分组的结果集:"+userQueryResultsStr);
3.10 Использование сплайсинга с несколькими условиями (BooleanBuilder):
QUser user = QUser.user;
//多条件处理
BooleanBuilder booleanBuilder = new BooleanBuilder();
booleanBuilder.and(user.age.eq(10));
booleanBuilder.and(user.name.contains("小"));
List<User> mostlist = jpaQueryFactory.selectFrom(user).where(booleanBuilder).fetch();
String mostlistStr = JSON.toJSONString(mostlist);
System.out.println("单表查询多条件处理的结果:"+mostlistStr);
3.11 Обработка пейджинговых запросов:
QUser user = QUser.user;
QueryResults<User> userQueryResults =
jpaQueryFactory.selectFrom(user).offset(0).limit(2).fetchResults();
String userQueryResultsStr = JSON.toJSONString(userQueryResults);
System.out.println("单表分页的结果集:"+userQueryResultsStr);